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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Опять USART. PRINTBIN и INPUTBIN


Опять USART. PRINTBIN и INPUTBIN

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

1

Две меги8. Аппаратный USART. Нужно передать строку фиксированной длины. Скорость 57600, кварцы 8МГц. Прерывания USART-а не используются.

Утрированный код передающей стороны

Dim S as String * 20
S = "12345678901234567890"
Printbin S

Принимающая сторона

Dim Received As String *20
Inputbin Received

В протеусе все замечательно работает, Received = S. В виртуальном терминале бегут передаваемые цифры. В железе не работает.
Пробовал приемник дополнить после Inputbin строкой
Lcd "!"
Восклицательный знак не появляется.
Снижение скорости USART ни как не влияет.
Printbin выполняется в программе обработки прерывания.

Print и Input не смог использовать, так как даже при Dim Received As String * 22, первый символ всегда портится. Опять же в протеусе.
Либо протеус неправильно симулирует Printbin/Inputbin в AVR, либо лыжи не катят.
Длина линии 30см.
Осциллографа нет ...

Отредактировано SIvan (2015-06-05 23:56:25)

0

2

Пробовали Print и Input с буфером? В хелпе есть подсказка CONFIG SERIALIN.

0

3

забудьте вы про протеус, ну зачем себе гемор делать?! ни разу не использовал, и не планирую. Только железо, только хардкор! :)
у меня работает программный уарт, и в проектах уже второй год работает не выключаясь по 3-4 месяца (если только электрики отключат, а так без проблем)

Open "comb.6:1200,8,n,1, inverted" For Input As #2         

Start_prg:

Inputbin #2 , Data_3                             ' принимаем
If Data_3 <> 32 Then Goto Start_prg              ' Ждём префикс - " "

Inputbin #2 , Data_3                             ' принимаем
If Data_3 <> 33 Then Goto Start_prg              ' Ждём стартовый байт - "!"

Inputbin #2 , Data_1                             ' номер стола

Inputbin #2 , Data_2                             ' команда
If Data_2 > 15 Then Goto Start_prg               ' 0 или 15

Inputbin #2 , Data_3                             ' принимаем байт окончания  - "."
If Data_3 <> 46 Then Goto Start_prg              ' не точка

Led = 1
' Print #1 , "Rx";
' Print #1 , Data_1
' Print #1 , Data_2
' Print #1 , ""

If Data_1 <> Adr_ustr Then                       ' не этому усройству
   Counter_rx_w = 0                               ' сброс счетчика
   Led = 0
   Goto Start_prg
End If

' Led = 1                      ' команда данному устройству

Incr Counter_rx_w
If Counter_rx_w < 2 Then Goto Start_prg          ' надо принять 2 команды подряд

  If Data_2 = 15 Then                             ' 15=On
      Power_rele = 1
  End If

  If Data_2 = 0 Then                              ' 0=Off
      Power_rele = 0
      Led = 0
  End If

Counter_rx_w = 0                                 ' Сброс Счетчика Попыток
My_time_w = 0                                    ' сброс счетчика времени при команде данному устройству

Goto Start_prg

+1

4

Добавил в приемник обработчик URXC. В протеусе продолжает работать. Сейчас буду пробовать в железе...
А протеус потому, что устройство имеет довольно широкий функционал с определенными таймингами, и диагностировать его в железе очень проблематично.

0

5

Что-то не растет кокос.

Поиск привел меня сюда же, на форум. Нашел, что PRINTBIN = "PRINT var ;", но на результат не влияет.
Уже сделал тестовые программы, в которых только прием и передача. Суть в следующем:

На приемнике есть LCD. С передатчиком связан по двум проводам. Один из них UART, второй провод для сигнализации передатчику, что все данные приняты, обработаны и отображены.
Приемник принимает данные и ставит на провод готовности единцу, показывая, что следующую порцию данных принять не готов. После обработки и отображения данных, на провод готовности ставит ноль и зацикливается, пока не будут приняты новые данные.
Передатчик же, отправляет данные только когда на линии готовности видит ноль.

Передатчик отправляет строку, для наглядности "123456789012345678ABCD". Первый сеанс передачи дает в приемнике эту строку правильно. А все последующие сеансы передачи в приемнике дают строку "ABCD123456789012345678".

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

Пробовали Print и Input с буфером? В хелпе есть подсказка CONFIG SERIALIN.

В подсказке используются еще CTS и RTS. У меня нет возможности их использовать. У меня всего два провода

Передатчик

dim s as string * 22
Label1:
waitms 100
if pinb.0 = 1 then goto label1
s="123456789012345678ABCD"
set portd.3
print s ;
reset portd.3
goto label1
end

Приемник

dim received as string * 22
on urxc receive
dim rcv_flag as byte
dim s1 as string * 20
dim s2 as string * 2

rcv_flag = 0
enable interrupts
enable urxc
reset portb.0 ' свободен и готов принимать

label2:
nop
if rcv_flag = 0 then goto label2
s1 = left(received, 20)
s2 = right(received, 2)
locate 1,1 : lcd s1
locate 2,1 : lcd s2
reset portb.0 ' свободен и готов принимать
rcv_flag = 0
goto label2

receive:
inputbin received
set portb.0 ' занят
return

Этот пример в протеусе работает как часы. А в железе происходит сдвиг данных.
Еще заметил, что в передатчике, сделанный для отладки set portd.3 происходит раньше, чем завершится передача данных на линии Tx. (в протеусе)

Я уже не знаю, куда копать...

0

6

http://sh.uploads.ru/t/6SkoF.jpg

Верхний сигнал = Tx, нижний = PORTD.3

0

7

Флаг поднимается в основном цикле (после обработки данных и отображения), но не суть.
Так же заметил, что при передаче "пачки" байтов, URXC в приемнике срабатывает лишь единожды, после первого байта.

Буду пробовать программный UART.

0

8

Здесь Ссылка делали общение GSM модуля с МК через аппаратный UART. По этим мотивам делал тесты с другим модулем,но принцип такой же:принимаем данные от модуля в буфер МК через UART,разбираем данные как нам надо,чистим буфер и все по-новой. В железе работает устойчиво.Вот один из тестовых кодов Ссылка,может пригодится. 8-)

+1

9

Всем огромное спасибо!
Проблема была найдена как только я решил поменять "полярность" линии готовности.
Причина, стыдно признаться, детская.  :canthearyou:
Между устройствами - кабель-удлиннитель USB, так как нужно 5 проводов. Прозвонил в нем обоймы разъемов - звонятся. Хорошо, так как длина линии нужна 5 метров. Ни один сигнальный провод не соединен с оплеткой. К дисплейному МК припаял хвост от другого кабеля, обоймы которого тоже звонились. Но в нем черный провод оказался соединен с оплеткой = с обоймой. На этот провод у меня и попала линия статуса ...

Отредактировано SIvan (2015-06-14 17:21:41)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Опять USART. PRINTBIN и INPUTBIN