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

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

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

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



контроль мк по uart

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

1

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

Код:
Config Pind.6 = Output

On Urxc Getchar

Dim Wtime As Word
Dim Inchar As String * 1 

Const Fastblink = 100
Const Slowblink = 500

Wtime = Slowblink

Enable Interrupts
Enable Urxc

Do
  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime
Loop

Getchar:
  Inchar = Inkey()
  Select Case Inchar
    Case "f" : Wtime = Fastblink
    Case "s" : Wtime = Slowblink
  End Select
Return

End

хочу сделать команды длинее одного символа, поменял строку Dim Inchar As String * 1  не вышло, думаю надо поменять эту строку Inchar = Inkey() только не знаю на что.

0

2

а что запрашивать будет? пк или другой мк?

0

3

планирую с пк, к примеру термометр - чтобы не постоянно гнал данные в терминал, а только когда придет соответствующая команда.

0

4

Ошибочка была .
Исправил.

Код:
Config Pind.6 = Output

On Urxc Getchar


Dim S As String * 10
Dim Get_w As Long
Dim Get_dln As Byte
Dim Get_byte As Byte
Dim Wtime As Word
Dim Inchar As String * 1

Const Fastblink = 100
Const Slowblink = 500

Wtime = Slowblink

Enable Interrupts
Enable Urxc

Do
  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime
Loop

Getchar:
  S = ""
  Get_w = 0
  Get_dln = 1

  '--принимаем первй символ
  Get_byte = Inkey()
  S = S + Chr(get_byte)                                     ' build string

  '--примаем остальные символы строки
  Do
    'для выхода из цикла в случае неприхода 0D,0A
    If Get_w > 50000 Then
      Exit Do
    End If

    Get_byte = Ischarwaiting()
    If Get_byte <> 0 Then
     Get_byte = Inkey()
     Select Case Get_byte
       Case 13 :                                            '<0D>
       Case 10 : Exit Do                                    '<0A>
       Case Else:
       Incr Get_dln
       S = S + Chr(get_byte)                                ' build string
      'защита от длинных посылок
      If Get_dln > 9 Then
        Exit Do
      End If
     End Select
    End If

  Loop

'на выходе из цикла имеем строку S


  Inchar = Inkey()
  Select Case S
    Case "1234" : Wtime = Fastblink
    Case "5678" : Wtime = Slowblink
  End Select




Return

End

+1

5

В примере ждем прихода первого символа, и принимаем остальные.
Длина строки не более 10 символов.
Строка должна заканичваться перевод строки, возврат каретки (0D,0A).
Время ожидания строки определяется
If Get_w > 50000 Then
      Exit Do
    End If

0

6

Мне кажется намудрили Вы
Проще помоему использовать Input

Код:
Dim S As String * 4
*
do
if s ="cod1" then gosub cod1
if s ="cod2" then gosub cod2
loop
*
*
Getchar:
  Inchar = Inkey()
  if inchar ="с" then input s
   

Return

далее проверяем S
команда выглядит так "ccod1"
а лучше Inkey() заменить на Ischarwaiting(), тогда команда будет "cod1"
а ещё лучше  вообще от них отказаться

Код:
Getchar:
 input s
Return

и если надо применить таймаут

Отредактировано kip (2011-01-13 21:10:27)

+1

7

а лучше Inkey() заменить на Ischarwaiting(), тогда команда будет "cod1"

наверно это и нужно было. спасибо всем, завтра попробую все варианты

0

8

попробовал ввод команд напрямую через input, это то что надо, спасибо!  :cool:

Код:
$regfile = "2313def.dat"
$crystal = 1000000
$baud = 1200
' $sim


Config Pind.6 = Output

On Urxc Getchar

Dim Wtime As Word
Dim S As String * 4

Const Fastblink = 100
Const Slowblink = 500

Wtime = Slowblink

Enable Interrupts
Enable Urxc

Do

  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime

Loop

Getchar:
 Input S
    If S = "val" Then
    Print Wtime
       End If
    If S = "fast" Then
    Wtime = Fastblink
    Print Wtime
       End If
     If S = "slow" Then
     Wtime = Slowblink
     Print Wtime
       End If

Return

End

Отредактировано Viktor (2011-01-14 08:50:57)

0

9

Рад помочь!
Я бы ещё посоветовал -
что в прерывании слишком долго операция выполняется , что не есть хорошо. Лучше в прерывании включать бит, и в основном цикле проверять его. если включён, то выполнять нужную операцию.
На время выполнения операции отключать прерывание "DISABLE Urxc"
Что будет если во время выполнения подпрограммы, на вход RX ущё чё нибудь придёт? подумайте.

+1

10

спасибо, буду иметь в виду!

0

11

я вот тоже пытаюсь поиграться с ком портом, у меня не работает Print  при вкл прерываниях по уарт(((
-------------------------------------
$regfile = "m48def.dat"
$crystal = 16000000
$baud = 19200

Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , _
Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0

Dim Var1 As String * 5

On Urxc Recieve_data
Enable Urxc
Enable Interrupts

Cursor Off
Cls
Locate 1 , 1
Lcd "Com1Test"
Wait 1

Do
nop
Loop

Recieve_data:
Inputbin Var1
Disable Urxc

Select Case Val(var1)
Case 65536 : Print "numbers"
End Select

Cls
Locate 1 , 1
Lcd var1

Enable Urxc
Return

End

Отредактировано Роман (2011-01-30 22:09:45)

0

12

перенеси print "numbers" под строчку end select и все заработает ;)
http://s44.radikal.ru/i106/1101/3d/3b97497ce337.png

0

13

хотя нет, усб-уарт вроде работает(замкнул рх и тх) , а вот  с контроллером работать не желает, странно! даже простенькая программка, где Print "Hello!" в цикле....В чем может быть дело?

Отредактировано Роман (2011-01-31 09:49:49)

0

14

Роман написал(а):

хотя нет, усб-уарт вроде работает(замкнул рх и тх) , а вот  с контроллером работать не желает, странно! даже простенькая программка, где Print "Hello!" в цикле....В чем может быть дело?

Заработало через такой метод Open "comd.3:19200,8,n,1" For Output As #1  и тд.. Понедельник день тяжелый...Странно

0

15

похоже что аппаратный uart накрылся, попробуй программку которая в начале топика, может хоть Rx работает, тогда не все так плохо.

Отредактировано Viktor (2011-01-31 10:24:40)

0

16

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

похоже что аппаратный uart накрылся, попробуй программку которая в начале топика, может хоть Rx работает, тогда не все так плохо.

нет, слава богу не накрылся, что то глюки, ща норма все работает

Отредактировано Роман (2011-01-31 10:40:23)

0