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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Просьба о помощи sim30+atinny2313


Просьба о помощи sim30+atinny2313

Сообщений 1 страница 18 из 18

1

Доброго всем времени суток.
Совсем недавно начал осваивать контроллеры, выбор остановил на AVR и Bascom. Нехитрые устройства вроде мигалок выходят наура. Задумал усложнить себе задачу, и сваять реле с управлением по команде SMS. В железе воплотил. А вот с программой прошу помоч. Несколько раз переписывал с нуля, Железо рабочее 100%, подключение тоже правильное (АТ команды передаются на GSM модуль, и принимаются контроллером от него). В некоторых вариантах прошивки, SMS о включении приходило, но не более того.
Буду признателен любой помощи: совету, правке кода...

Собственно вопрос в том, почему тини невсегда корректно принимает строку???

Код:
'BASCOM-AVR 2.0.5.0
'SIM300 DZ
'ATTINY 2313

$regfile = "attiny2313.dat"
$crystal = 4000000
$baud = 9600
$hwstack = 20
$swstack = 8
$framesize = 24
Config Serialin = Buffered , Size = 12

Config Portb = Input
Config Portb.1 = Output
Config Portd = Input

Rele Alias Portb.1

Dim B As Byte
Dim I As Byte
Dim Q As Byte
Dim R As Byte
Dim Stemp As String * 12
Dim Sret As String * 36
Declare Sub Getline(s As String)
Declare Sub Showsms(s As String )
Declare Sub Delsms(s As String )

Declare Sub Sendsms(s As String )
Declare Sub Dorele


Q = 0
R = 0
Reset Rele

Enable Interrupts

'настройка gsm модуля-----------------------------------------------------------

Do
Print "AT"                        'посылаем АТ                          
Getline Sret
Waitms 100
Loop Until Sret = "OK"     'выход при ответе ОК

Print "AT+CMGF=1"        'текстовыйформат SMS                                   
Getline Sret
Waitms 100

Print "AT+CSDH=0"                                          
Getline Sret
Waitms 100

Print "AT+CPMS=" ; Chr(34) ; "SM" ; Chr(34)             'местохранения SMS   
Getline Sret                                                             ' ответ - sm 0,20....
Getline Sret                                                              'OK
Waitms 100

Gosub Sendsms                                                      'переходим к отправке SMS

'главный цикл-------------------------------------------------------------------

Do
   Getline Sret                                                      'получаем строку
   I = Instr(sret , ":")
   If I > 0 Then
      Stemp = Left(sret , I)
      Select Case Stemp
         Case "+CMTI:" : Showsms Sret                    'если в строке есть "+CMTI:" идем читать SMS
      End Select
   End If
Loop


'прием строки-------------------------------------------------------------------

Sub Getline(s As String)
  S = ""
  Do
    B = Inkey()
    Select Case B
       Case 0
       Case 13
       Case 10 : If S <> "" Then Exit Do             'выход по принятии 10 при условии, что в строке есть символы
       Case Else
         S = S + Chr(b)                                      'составляем строку
    End Select
  Loop
End Sub

'чтение SMS---------------------------------------------------------------------

Sub Showsms(s As String )
    I = Instr(s , ",")                      'определение номера sms  в списке
    I = I + 1
    Stemp = Mid(s , I)
    Print "AT+CMGR=" ; Stemp      ' показать SMS
    Getline S
    Waitms 100
    Do
       Getline S
       Select Case S
          Case "rele" : Gosub Dorele       ' если в тексте sms есть "rele" то идем управлять  реле
          Case "OK" : Exit Do
          Case Else
       End Select
    Loop
Gosub Sendsms                                  
Gosub Delsms
End Sub

'удаление SMS-------------------------------------------------------------------

Sub Delsms(s As String )
Do
Print "AT+CPMS?"                               'удаляем sms
Getline Sret
Getline Stemp                                    'пока ниодного
Waitms 100
    I = Instr(sret , ",")                         'не останется
    I = I + 1
    Stemp = Mid(sret , I)
I = Val(stemp)
If I = 0 Then Exit Do                   'выход если количесво сообщений  = 0
 Print "AT+CMGD=" ; Stemp
    Getline Stemp
    Waitms 100
Loop
End Sub

'отправка SMS-------------------------------------------------------------------

Sub Sendsms(s As String )
Waitms 100
Print "AT+CPBR=1"                         'читаем номер из первой ячейки
Getline Stemp
Waitms 100
I = Instr(stemp , "+79")
Stemp = Mid(stemp , I , 12)              'извлекаем номер
Waitms 100
Print "AT+CMGS=" ; Chr(34) ; Stemp ; Chr(34)

If R = 0 Then
Stemp = "OFF"
Else
Stemp = "ON"
End If
If Q = 0 Then                             ' при включении отправляет "POWER ON"
Print "POWER ON"
End If
If Q = 1 Then
Print "RELE " ; Stemp ; Chr(26)      'если команда коректная отправляет RELE ON/OFF
End If
If Q = 2 Then
Print "ERROR 01" ; Chr(26)            'это при некоректной комманде
End If
Getline Sret
Getline Stemp
Q = 1
End Sub

'действие с реле----------------------------------------------------------------

Sub Dorele
    I = Instr(stemp , "rele")
    I = I + 5
    Sret = Mid(stemp , I , 1)
I = Val(sret)
If I = 0 Then
R = 0
Reset Rele
End If
If I = 1 Then
R = 1
Set Rele
End If
If I > 1 Then
Q = 2
End If
Gosub Sendsms

End Sub

Отредактировано Виктор (2011-05-27 11:08:38)

0

2

Виктор написал(а):

Буду признателен любой помощи: совету, правке кода...

Вот-бы ещё код откоментировать, так глядишь и люди потянуться.
Я С СИМ300 не работал, благо телефонов разных полно. Всё вроде получалось. А отрабатывал на протеусе. Там и выходь на физический ком-порт есть, и терминал куда хочешь можно подключить. По коду без коментариев долго разбираться.
Вот увидел прерывание включаете, а от чего прерывание не понятно :dontknow:
Вот это тоже не понятно :dontknow:

Код:
 Select Case B
       Case 0
       Case 13
       Case 10 : If S <> "" Then Exit Do
       Case Else
         S = S + Chr(b)

0

3

это он отфильтровывает ненужные символы, а из остальных клеит строку.

Мне вот интересно, а в СИМ300 тоже применяется хитрая кодировка СМС или он умеет их сам перекодировать?

0

4

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

Мне вот интересно, а в СИМ300 тоже применяется хитрая кодировка СМС или он умеет их сам перекодировать?

Еслм имеется в виду PDU формат для отправки кирилицы, то с этим морока.

0

5

Всем привет, похожая проблема. написал код, в протеусе тестил, на команды реагирует, а в железе не реагирует на прием смс.

Код:
$regfile = "m8def.dat"                                      ' specify the used micro
$crystal = 8000000                                          ' used crystal frequency
$baud = 115200
'$baud = 19200



Dim Command_tx As String * 16
Dim Command_rx As String * 16
Dim Command_recieve As String * 16

Dim I As Byte , J As Byte

Dim Element_count As Byte
Dim Index As Byte

Dim Get_data(2) As String * 16
Dim N(2) As String * 4


'Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portd.5 = Output

Declare Sub Send_sms
Declare Sub Phone
Declare Sub Read_sms
Declare Sub Select_comand



'-------------initialasing---------------

Set Portd.5
Waitms 200
Reset Portd.5
Wait 2
Set Portd.5
Wait 5

Print "AT+CMGF=1"
Wait 1
Print "AT+CREG=1"
Wait 1
Print "AT+QMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34)
Wait 1

'Call Phone

'----------------------------------------
On Urxc Recieve
Enable Urxc
Enable Interrupts

Do
  NOP
Loop
End



'-----------------------------------------'
Recieve:
Inputbin Command_rx
Element_count = Split(command_rx , Get_data(1) , ":")
Command_recieve = Trim(get_data(1))
Get_data(2) = Mid(get_data(2) , 6 , 2 )
Print Get_data(1)
Print Get_data(2)
If Get_data(1) = "+CMTI" Then
Index = Val(get_data(2))
Call Read_sms
Else
Goto Metka

End If

Metka:

Select Case Command_rx

Case "Cmd-1"
Command_tx = "COMAND 1 EXE"
Call Send_sms


Case "Cmd-2"
Command_tx = "COMAND 2 EXE"
Call Send_sms


Case "Cmd-3"
Command_tx = "COMAND 3 EXE"
Call Send_sms

End Select

Return




'---------subprograms--------------------

Sub Send_sms
Disable Urxc
Print "AT+CMGS=" ; Chr(34) ; "89279241239" ; Chr(34) ; ",129"
Wait 1
Print Chr(34) ; Command_tx ; Chr(34);
Wait 1
Print Chr(26);
Wait 1
Print Chr(13)
Enable Urxc
End Sub




'-----------------------------------------'

Sub Read_sms
Print "AT+CMGR=" ; Index
Wait 1
End Sub




'-----------------------------------------'
Sub Phone
Disable Urxc
Print "ATD89279241239i;"
Wait 5
Print "ATH"
Wait 1
Enable Urxc
End Sub





'-----------------------------------------'
Sub Select_comand

End Sub

Отредактировано Роман (2011-08-19 18:50:13)

0

6

1 ты еще раз доказал, что симулятор работает неправильно!
2 скорее всего такая ошибка: в прерывании приемника нельзя использовать функцию Inputbin? т.к. бит готовности приемника уже сброшен. нужно просто читать регистр данных
command_rx = Udr.
3 вообще, так писать нельзя. Время обработки прерывания UART не должно быть больше времени приема передачи одного символа.
т.е все передачи должны быть в главном цикле, иначе можно пропустить другие принимаемые команды

0

7

все, справился я с модулем...Все работает хорошо! Вот тока обьясните мне алгоритм этот , почему обычной командой Input нельзя сделать опрос?

Код:
Sub Getline
Command_rx = ""
Do
    J = Inkey()
    Select Case J
       Case 0
       Case 13
       Case 10 : If Command_rx <> "" Then Exit Do         
       Case Else
       Command_rx = Command_rx + Chr(j)                     ' СОСТАВИМ СТРОКУ
    End Select
Loop
End Sub

0

8

У меня всё работает.

Код:
Sub Getline(s As String)
   S = ""
   Do
      B = Waitkey(#1)
      Select Case B
          Case 0                                            'nothing
          Case 13                                           ' we do not need this one
          Case 10 : If S <> "" Then Exit Do                 ' if we have received something
          Case Else
            If B > 31 Then S = S + Chr(b)                   ' build string
      End Select
   Loop
End Sub

А опрос провожу в основном цикле:

Код:
A = Ischarwaiting(#1)
    If A = 1 Then
        Getline S
        Z = Left(s , 4)

        If Z = "+CMT" Then
            Red_led = 1
            Sms_num = Right(s , 2)
            Stmp = Left(sms_num , 1)
            If Stmp = "," Then Sms_num = Right(s , 1)
            Print #1 , "AT+CMGF=1"
            Getline S

            Wait 1
            Phon_numb = ""
            Print #1 , "AT+CMGR=" ;
            Print #1 , Sms_num
            Getline S
            Phon_numb = Mid(s , 22 , 12)
            Getline S
            My_sms = S

            Waitms 500
            Print #1 , "AT+CMGD=" ;
            Print #1 , Sms_num
            Getline S
            Waitms 500
            ........

В "Phon_numb"  номер с которого пришла SMS.
В "My_sms" SMS-ка.

0

9

Модуль перестал отправлять сообщения, вылазит такая ошибка +CMS ERROR: 28  (Unindentified subscriber)

Отредактировано Роман (2011-08-20 21:13:26)

0

10

На каком этапе и после какой команды?
Что пишет при включении и инициализации.
Я, когда осваивал модем, вэял две платы
ARDUINO без МК подключил к входам FT232RL
сигналы TX и RX от МК с отлаживаемой программой,
воткнул в USB порты, запустил две терминалки и
и смотрел сообщения от МК и от модема. И быстро
всё отладил.

0

11

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

+CMTI: "SM",3[0D][0A]
AT+CMGR=3[0D]
10:13:29:781 MOUDULE -> PC
[0D][0A]
+CMGR: "REC UNREAD","+79279241239","","2011/08/21 08:14:20+1
6"[0D][0A]
cmd1[0D][0A]
[0D][0A]
OK[0D][0A]
10:13:30:843 MOUDULE -> PC
AT+CMGS="89279241239",129[0D][0D][0A]
>
10:13:31:890 MOUDULE -> PC
"COMAND 1 EXE"[0D][0A]
> [0D][0A]
[0D][0A]
> [0D][0A]
10:13:35:203 MOUDULE -> PC
[0D][0A]
+CMS ERROR: 28[0D][0A]

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

Отредактировано Роман (2011-08-22 05:01:42)

0

12

Да была проблема с удалением, я не зря
задержки поставил. Ещё у меня есть СМС
команда по которой удаляются все сообщения.
Кстати, подпрограмма Getline не имеет выхода
по таймауту и при плохой связи с модемом всё
виснет. Её надо переделать, и наверно лучше
на asm.

0

13

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

Да была проблема с удалением, я не зря задержки поставил. Ещё у меня есть СМСкоманда по которой удаляются все сообщения.

Я тоже использую такую команду  "AT+CMGD=DEL ALL" и задержки стоят от 0,5 до 3 секунд пробывал, серавно не удаляет, тока вручную с терминала.
.

0

14

Подскажите, плиз, как отправить смс на кирилице,  в текстовом режиме? И ещё, при отправки составной смски( Print "текст1":Print "текст2") в телефоне между текст1 и  текст2 появляется строка. Видимо телефон реагирует на &h0d;&h0a вконце каждого Print. Можно ли это побороть?

0

15

kip
Каждый принт завершайте точкой с запятой и не будет энтера с переносом строки. )

0

16

Как вариант.
Но, тогда получается всё в одну строку. То-же не очень. Пока решил так- весь текст перевёл через Printbin, а в конце ставлю только &h0d (вместо &h0d;&h0a, который выдаёт Print)
А как на кирилицу перевести?

0

17

А чем кириллица отличается от английского? Только кодом, нужно понять какая там таблица используется, win\dos.
Теоретически принт от принтбин-а сильно не отличается в вашем варианте, можно так же выводить принтом и добавлять chr 13.

0

18

Вот бы ещё в коде используемая библиотека промелькнула ) не смог разобраться.
не надеюсь на ответ.
Если кто попадёт сюда в поисках Bascom + SIM300 - предположительно работает по UART, информации за сутки так не накопал.

Отредактировано Ev3658 (2013-07-09 23:58:57)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Просьба о помощи sim30+atinny2313