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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » RS-232. Асинхронная передача. Имхо, нет синхронизации.


RS-232. Асинхронная передача. Имхо, нет синхронизации.

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

1

Добрый вечер  :)  Урезал код до минимальной читабельности. Пните, плиз, в нужную сторону...

Свернутый текст

$Regfile="m8adef.dat"
$Crystal=4000000
$hwstack=32
$swstack=8
$framesize=16
$baud = 9600

Config Pind.0 = input
Config Pind.1 = Output

'Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Config Input1 = Crlf , Echo = Crlf

Config Lcdpin = Pin , Rs = Portd.3 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Debounce = 10

dim code as byte
dim buf as byte

On Urxc CodeIn
Enable Urxc
Enable Interrupts

Do
if  buf=1  then
    code=code
    printbin code
    buf=0
  end if
Loop

CodeIn:
Buf=1
inputbin code
return

End

Спасибо за внимание :)

0

2

Это - лишнее...

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

Config Pind.0 = input
Config Pind.1 = Output

Этот шаг абсолютно непонятен...

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

code=code

А какую синхронизацию ожидаем-то ? ;)
RS-232 сам по себе асинхронный...

Отредактировано Nord (2019-04-08 02:41:29)

0

3

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

Это - лишнее...

Этот шаг абсолютно непонятен...

А какую синхронизацию ожидаем-то ?
RS-232 сам по себе асинхронный...

Отредактировано Nord (Сегодня 02:41:29)

Ну да, лишнее... И без Pind.x работает :)
по поводу code=code:

Код:
Do

 if  buf=1 then
    code=255-code
    printbin code
    buf=0
 end if

Loop


CodeIn:
 Buf=1
 inputbin code
return

End

получаем:
http://s8.uploads.ru/t/6u4Eg.jpg

дописываю, чтобы "по первому байту" как-то подружились:

Код:
Do

 if  buf=1 and code=7 then
    code=255-code
    printbin code
    buf=0
 end if

Loop


CodeIn:
 Buf=1
 inputbin code
return

End

... Пытаются подружиться, но... :
[url=http://uploads.ru/21Pwj.jpg]http://s7.uploads.ru/t/21Pwj.jpg[/url

Более правильно выражусь: не синхронность , а "привязка стробов к середине битового интервала" (с)

Отредактировано andr_Ku (2019-04-08 09:24:40)

0

4

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

buf=0

Должно быть до printbin, а не после.

МК случайно не работает на частоте 8 МГц?
Размеры стеков недостаточные. Нужно увеличить.

0

5

Пётр написал(а):

Должно быть до printbin, а не после.

МК случайно не работает на частоте 8 МГц?
Размеры стеков недостаточные. Нужно увеличить.

Не совсем понял почему "buf=0" д.б. до "printbin code" .  Имхо, отправил посылку... потом указал что буфер "пуст". Ну да ладно. Поменял.
Стеки увеличил в 2 раза. Кварц на 4мГц, внешний (отпаял ножку -- запуска нет, импульсов нет). Fuse Low "0xCC", Fuse High "0xD9".

Как было до вышеописанного, так и сейчас ничего не поменялось. Вот что сейчас творится:
http://sh.uploads.ru/t/SNDVi.jpg

...скорость общения увеличивается х.з. почему...

0

6

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

Не совсем понял почему "buf=0" д.б. до "printbin code" .  Имхо, отправил посылку... потом указал что буфер "пуст".

В таком случае в прерывании не следует записывать данные в code если Buf=1.

0

7

Пётр написал(а):

В таком случае в прерывании не следует записывать данные в code если Buf=1.

Код:
Do
if  buf=1  then
    code=code
    printbin code
    buf=0
  end if
Loop

CodeIn:
Buf=1
inputbin code
return

End

Я же в основном цикле записал. Или как нужно было?!?

0

8

А так не проще было делать.

0

9

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

Я же в основном цикле записал.

Записал это скопировал содержимое переменной в нее же? :D
Смысла в этом вообще нет. :dontknow:

В вашем варианте кода есть вероятность что при выполнении кода между if  buf=1  then и buf=0 произойдет прерывание и в переменную buf запишется сначала 1, а после 0. Поэтому флаг нужно сбрасывать сразу же как только обнаружена его установка.

0

10

Пётр написал(а):

Записал это скопировал содержимое переменной в нее же? 
Смысла в этом вообще нет. 

В вашем варианте кода есть вероятность что при выполнении кода между if  buf=1  then и buf=0 произойдет прерывание и в переменную buf запишется сначала 1, а после 0. Поэтому флаг нужно сбрасывать сразу же как только обнаружена его установка.

Ну да... ну да. :) Вы правы. Как-то об этом я не подумал, т.к. большой скорости при обмена данных так бы и было. Логично, что когда сработает прерывание на ввод новых данных, хотя предыдущие данные еще не успели передаться, то в buf запишется "1" и тут же будет заменена "0" из командной строки.

В данном случае (примере) не обмен данными осуществлялся, а запрос/ответ. Все равно бы ошибка вышла бы.
Это не оправдание, писать нужно изначально правильно. И лучше сейчас понять,чем потом баги искать..

Спасибо за подсказку :)

0


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » RS-232. Асинхронная передача. Имхо, нет синхронизации.