Вверх ↑
Этот топик читают: Гость
Ответов: 27
Рейтинг: 0
#1: 2017-01-12 10:39:11 ЛС | профиль | цитата
Добрый день! Раньше как то не приходилось работать с Com портом по обмену данными с контроллером, а сейчас вот понадобилось и столкнулся с такой вот проблемой. К сожалению осциллографа пока нет, свой старенький продал, жду другой с Алиэкспресса и пока нет возможности посмотреть реальные передаваемые сигналы. А симулятор показывает мне что то не то, что я ожидаю увидеть. Контроллер ATtiny2313. С компьютера я передаю по UART на контроллер "1" которую набираю на клавиатуре. А в окне симулятора в регистре приемника UDR вижу такую бинарную последовательность - 00110001. В десятичном представлении это цифра - 49.
А я ожидаю увидеть там - 00000001, т.е. десятичную единицу. Следом передаю "0" и вижу - 00110000. В десятичном виде это цифра - 48. Так как в программе контроллера я проверяю 0-й бит на "0" и "1", то проверка проходит успешно и программа в контроллере правильно выполняется. Типа правильно..
Потому что у цифры "49" нулевой бит будет как раз "1", а у цифры "48" этот бит будет равен "0". Но реально в регистре приемника UDR я вижу другие бинарные данные.
Что я не так понимаю? Кто знает, подскажите пожалуйста. Компонент через который отправляю данные в компьютерной программе - COMEX. Данные посылал и через компонент Edit, и кнопкой Button у которой через свойство Data ставил "1" и "0" тип и String и Integer. Результат всегда один 49 и 48. Кстати, когда отправлял данные вообще через другую терминалку, то в контролле все те же - 49 и 48. Что я не так понимаю?

Редактировалось 1 раз(а), последний 2017-01-12 10:40:55
карма: 0

0
Ответов: 203
Рейтинг: 2
#2: 2017-01-12 10:49:32 ЛС | профиль | цитата
amateur, можно вашу схему увидеть ? Уверен что 1 на клавиатуре не есть 00000001 в байтах.
карма: 0

0
Ответов: 27
Рейтинг: 0
#3: 2017-01-12 11:07:42 ЛС | профиль | цитата
да, конечно. Схема тестовая, поэтому Edit-ы "Скорость" и "Шаги" не задействованы пока.

Add(COMEX,760143,420,133)
{
Port=3
DataBits=1
Point(doRXClear)
link(Port,9873407:String,[])
link(BaudRate,3043798:String,[(433,121)(496,121)])
}
Add(MainForm,12217626,35,35)
{
Width=360
Height=127
BorderStyle=1
Position=1
}
Add(Button,3272966,280,70)
{
Left=155
Top=75
Width=85
Color=85
Caption="Отрыть порт"
link(onClick,622473:doEvent1,[])
}
Add(Button,4859171,280,119)
{
Left=260
Top=75
Width=85
Color=85
Caption="Закрыть порт"
link(onClick,11800175:doEvent1,[])
}
Add(Label,12648995,35,273)
{
Left=200
Top=5
Width=75
Font=[MS Sans Serif,10,1,0,1]
Caption="Com-порт"
}
Add(Label,13898853,42,266)
{
Left=130
Top=5
Height=20
Font=[MS Sans Serif,10,1,0,1]
Caption="Шагов"
}
Add(LED,2410213,420,182)
{
Left=265
Top=55
Width=30
Height=15
Shape=1
ColorOn=65280
ColorOff=32768
}
Add(Hub,622473,336,70)
{
OutCount=3
link(onEvent1,2410213:doOn,[(364,76)(364,202)])
link(onEvent2,760143:doOpen,[(364,83)(364,139)])
link(onEvent3,3790703:doOff,[(364,90)(364,237)])
}
Add(LED,3790703,420,224)
{
Left=315
Top=55
Width=30
Height=15
Shape=1
}
Add(Hub,11800175,336,119)
{
OutCount=3
link(onEvent1,2410213:doOff,[(385,125)(385,195)])
link(onEvent2,760143:doClose,[(385,132)(385,146)])
link(onEvent3,3790703:doOn,[(385,139)(385,244)])
}
Add(Button,4093520,280,168)
{
Left=10
Top=50
Color=50
Caption="ПРАВОЕ"
Data=Integer(1)
link(onClick,4759371:doEvent1,[])
}
Add(Button,8925563,280,266)
{
Left=10
Top=75
Width=130
Color=130
Caption="СТОП"
Data=Integer(0)
link(onClick,4759371:doEvent4,[(324,272)(324,195)])
}
Add(Hub,4759371,336,168)
{
InCount=4
OutCount=1
link(onEvent1,760143:doWrite,[(385,174)(385,153)])
}
Add(ComboBox,3043798,483,63)
{
Left=290
Top=25
Height=21
Strings=#3:600|4:1200|4:2400|4:4800|4:9600|5:14400|5:19200|5:28800|5:38400|5:56000|5:57600|6:115200|
Text=""
}
Add(Label,16613839,49,259)
{
Left=285
Top=5
Width=66
Height=20
Font=[MS Sans Serif,10,1,0,1]
Caption="Битрейт"
}
Add(Label,6929646,56,252)
{
Left=5
Top=5
Width=106
Height=20
Font=[MS Sans Serif,10,1,0,1]
Caption="Скорость дв."
}
Add(Edit,14355808,161,168)
{
Left=125
Top=25
Width=55
Text=""
link(onChange,11785683:doEvent2,[])
}
Add(Edit,14813948,161,119)
{
Left=10
Top=25
Width=85
Text=""
link(onChange,11785683:doEvent1,[(205,125)(205,167)])
}
Add(ComboBox,9873407,413,63)
{
Left=210
Top=25
Height=21
Strings=#1:1|1:2|1:3|1:4|1:5|1:6|1:7|1:8|1:9|2:10|
Text=""
}
Add(Hub,11785683,217,161)
{
InCount=2
OutCount=1
link(onEvent1,4759371:doEvent3,[(256,167)(256,188)])
}
Add(Button,2710215,280,217)
{
Left=85
Top=50
Color=50
Caption="ЛЕВОЕ"
Data=Integer(1)
link(onClick,4759371:doEvent2,[(324,223)(324,181)])
}


--- Добавлено в 2017-01-12 11:36:18

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

Редактировалось 1 раз(а), последний 2017-01-12 11:36:18
карма: 0

0
Ответов: 4630
Рейтинг: 749
#4: 2017-01-12 12:53:25 ЛС | профиль | цитата
kaban4ik писал(а):
Уверен что 1 на клавиатуре не есть 00000001 в байтах.
Конечно, не есть. Он представлен кодом клавиши, которому соответствует символ '1' в кодировке, и который имеет код 49.

amateur писал(а):
А в окне симулятора в регистре приемника UDR вижу такую бинарную последовательность - 00110001. В десятичном представлении это цифра - 49
Метод doWrite компонента принимает и пишет данные в виде строки, а строка состоит из байтов, каждый из которых представляет собой код символа в текущей кодировке. Символ '1' представлен байтом со значением 49. Как временное решение - в Button.Data выбери тип String и укажи вот так: \1
Бекслеш и цифра после него в строковых свойствах HiAsm позволяют вводить непечатаемые символы по их кодам. В данном случае туда будет занесен символ с кодом 1 (и посланный байт будет в виде 00000001). С остальными байтами также прокатит (кроме \0, но и там можно выкрутиться).

А более правильный вариант - в COMEX добавить свойство DataType, либо модифицировать Converter, чтобы он умел любые примитивные типы выдавать/принимать как строку (более точно - как тип Delphi string, состоящий из байтов, из которых состоят исходные данные).

Редактировалось 1 раз(а), последний 2017-01-12 12:54:03
карма: 26

0
Ответов: 8926
Рейтинг: 823
#5: 2017-01-12 12:53:59 ЛС | профиль | цитата
amateur, может эта табличка осветит путь истинный
схемка


Add(MainForm,2953706,21,105)
{
Width=223
link(onCreate,10343330:doFor,[])
}
Add(For,10343330,77,119)
{
End=255
link(onEvent,2831839:doConvert,[])
}
Add(Convertor,2831839,126,119)
{
Mode=4
link(onResult,11749158:doValue,[])
}
Add(Convertor,2578533,210,119)
{
Mode=8
Digits=8
link(onResult,5859751:doString,[])
link(Data,5220153:Var2,[])
}
Add(FormatStr,5859751,259,119)
{
DataCount=3
Mask="%1;%2;%3"
link(onFString,11079332:doAdd,[])
link(Str2,5220153:Var3,[(272,110)])
link(Str3,11749158:Value,[(279,103)(248,103)(248,159)(174,159)])
}
Add(Memory,11749158,168,119)
{
link(onData,2578533:doConvert,[])
}
Add(StringTable,11079332,301,119)
{
Left=5
Top=5
Width=200
Height=255
Columns=#7:Bite=70|6:Dec=50|7:Char=50|
}
Add(GetDataEx,5220153,210,105)
{
Angle=3
link(Data,10343330:Position,[(118,110)(118,159)(83,159)])
}

карма: 19

0
Ответов: 27
Рейтинг: 0
#6: 2017-01-12 16:20:23 ЛС | профиль | цитата
Netspirit, Леонид, спасибо! Склерозник я хренов, вынес себе мозг контроллером и симулятором и совсем забыл про коды клавиш, а ведь иногда сам пользуюсь таблицами кодов, когда надо вставить какой то из тех, которых нет на клавиатуре
Бонусом, схема Леонида еще и подсказала какую бинарную последовательность надо ждать, когда например перед количеством шагов для изменения направления вращения шагового двигателя нужно послать "+" или "-", то в регистре приемника UART контроллера нужно ожидать или 00101011 или 00101101, а не плюсики с минусиками
Забыл добавить, ну надо же совпадение какое, я проверял 0-й бит, и в бинарном виде приходящие десятичные 49 и 48 точно совпадали с тем что я ждал...

Редактировалось 1 раз(а), последний 2017-01-12 16:26:29
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#7: 2017-01-13 10:04:50 ЛС | профиль | цитата
Леонид писал(а):
может эта табличка осветит путь истинный
и ничего не смущает?

00000000 0 ☺
00000001 1 ☺
00000010 2 ☻
00000011 3 ♥
00000100 4 ♦

Редактировалось 4 раз(а), последний 2017-01-13 10:33:09
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8926
Рейтинг: 823
#8: 2017-01-13 11:21:21 ЛС | профиль | цитата
Tad, ладно придираться-то Больше печалит, что я опять биты неправильно обозначил, а ведь Galkov указывал
карма: 19

0
Ответов: 9906
Рейтинг: 351
#9: 2017-01-13 14:37:03 ЛС | профиль | цитата
Tad писал(а):
и ничего не смущает?

Как бы не рассчитан FormatStr на непечатные символы ...
И у себя у нутре использует символы #0 и #1 для собственных целей.

Как реализовать эти "собственные цели" без этих ограничений, идей пока нет

Редактировалось 1 раз(а), последний 2017-01-13 14:38:07
карма: 9

0
Ответов: 4630
Рейтинг: 749
#10: 2017-01-13 15:48:18 ЛС | профиль | цитата
Galkov писал(а):
идей пока нет
Строить список позиций замены, заодно подсчитывать результирующую длину строки, выделять память один раз, в цикле по списку замен делать Move(Src->Dst)+Move(ReplaceN->Dst).
Заодно и скорость увеличится на бинарных данных с множеством #0 и #1.

Редактировалось 2 раз(а), последний 2017-01-13 15:49:42
карма: 26

0
Ответов: 27
Рейтинг: 0
#11: 2017-01-13 20:46:19 ЛС | профиль | цитата
Netspirit, в общем смысле я примерно понял. При таком G-коде
N10 G01 X10.0 Y37.0 F100
N11 X20.0 Y40.0 Z40.0
N10 и N11 - это номера кадров и они нам не нужны, предположим первая строка станком уже выполнена, значит мне нужно распарсить следующую, сформировать на ее основе свою и послать в контроллер. Для этого, в компьютерной программе пересчитываю разность координат по осям в миллиметрах в количество шагов двигателей, и при дискретности перемещений станка например 0.1мм, записываю новые данные перемещений примерно так.
1. По "X" нужно сделать 100 шагов, и при том что следующая координата больше предыдущей, тогда она запишется со знаком "+", так мы задаем например правое вращение двигателя.
2. По "Y" нужно сделать 30 шагов. Формат записи тот же, со знаком "+".
3. По "Z" после выполнения перемещений по XY, переместить инструмент на новую позицию по вертикали.
4. Скорость(F100) - нам пока не нужна.
Значит запись должна выглядеть примерно так: +100 +30 -55 (предположим последняя позиция по "Z" была 45.5)
Тогда я имею посылку размером 10байт, в которой символы "+" и "-" остаются такими же как прислал Леонид, а на "1", "0", "3" и "5" нужно сделать таблицу замены и наверное правильно ты сказал, если она будет в бинарном виде. Вопрос, как ее послать через COMEX в бинарном виде?!
Вопрос разбора команд G-кода сейчас не стоит, сейчас мне нужно разобраться с отправкой-приемом данных через Com-UART. Пока в такой простой форме. А может товарищ nesco знает?!
карма: 0

0
Ответов: 8926
Рейтинг: 823
#12: 2017-01-13 21:30:21 ЛС | профиль | цитата
amateur, отправка/приём данных через СОМ не вызывает трудностей. Но надо чётко представлять сначала в каком виде их (данные) принимает/отправляет ваш контроллер. (Да и не забываем, что СОМ порт посылает байт 10-ю посылками, первая и последняя -- старт и окончание, восемь между ними -- значение байта.)
карма: 19

0
Ответов: 27
Рейтинг: 0
#13: 2017-01-13 22:42:04 ЛС | профиль | цитата
Леонид, при чтении регистра-приемника контроллера я считываю только чистые данные, тоесть 8бит или один байт, стартовый и стоповый бит в данные не вмешиваются. Я сейчас не говорю про помехи и прочее, а только так, как это должно быть в нормальном режиме работы контроллера.
Или тогда я вас просто не понял.
карма: 0

0
Ответов: 8926
Рейтинг: 823
#14: 2017-01-13 23:16:06 ЛС | профиль | цитата
amateur, если на стороне приёмника считывается переданный байт, то какие проблемы могут быть с передачей через СОМ
Ну например: 144.9 мм =1449 шагов, в двоичной двухбайтной записи 00000101(5) старший байт, 10101001(169)младший байт
схема


Add(MainForm,2953706,196,77)
{
}
Add(Edit,508113,196,133)
{
Left=65
Top=25
Width=60
Text="1449"
DataType=2
link(onEnter,3352099:doEvent1,[])
}
Add(Label,9547026,196,175)
{
Left=125
Top=25
Width=35
Height=17
Caption="шагов"
}
Add(Convertor,587470,364,140)
{
Mode=4
link(onResult,10651108:doWrite,[])
}
Add(Math,12948923,273,140)
{
OpType=7
Op2=256
ResultType=0
link(onResult,4970176:doEvent1,[])
}
Add(Math,7907249,273,189)
{
OpType=8
Op2=256
ResultType=0
link(onResult,11182268:doEvent1,[])
}
Add(Hub,3352099,238,140)
{
link(onEvent1,12948923:doOperation,[])
link(onEvent2,7907249:doOperation,[(263,153)(263,195)])
}
Add(ListBox,255378,413,56)
{
Left=185
Top=10
Width=100
Height=230
}
Add(Hub,4970176,322,140)
{
link(onEvent1,5392140:doWork2,[])
link(onEvent2,12622992:doWork2,[])
}
Add(Hub,11182268,315,189)
{
link(onEvent1,5392140:doWork3,[(354,195)])
link(onEvent2,12622992:doWork3,[(347,202)])
}
Add(HubEx,5392140,350,140)
{
link(onEvent,587470:doConvert,[])
}
Add(HubEx,12622992,343,147)
{
Angle=3
link(onEvent,255378:doAdd,[(347,62)])
}
Add(COM,10651108,413,119)
{
}
карма: 19

0
Ответов: 4630
Рейтинг: 749
#15: 2017-01-16 12:07:55 ЛС | профиль | цитата
Леонид, проблема в том, что COMEX принимает данные в виде строки. Ему нужно вот это +100+30-55 преобразовать в строку (показано в HEX):
2B642B1E2D37

Здесь на смещение я отвел 1 байт, но если оно может быть больше 255, то нужно отводить 2 байта. 2B - знак '+', 2D - знак '-', остальное - смещение.

amateur, если это так, то подобную строку можно сформировать так (StrToHex при отправке в порт не нужно):

Add(MainForm,2953706,21,105)
{
Position=1
}
Add(Memory,2932007,189,119)
{
Default=String(+)
AddHint(-10,-34,31,13,Default)
}
Add(Memory,6454270,259,119)
{
Default=Integer(100)
AddHint(-10,-34,33,13,Default)
}
Add(Memory,1023962,441,119)
{
Default=Integer(30)
AddHint(-10,-34,27,13,Default)
}
Add(Memory,14007082,658,119)
{
Default=Integer(55)
AddHint(-10,-34,27,13,Default)
}
Add(Memory,7101387,343,119)
{
Default=String(+)
AddHint(-10,-34,31,13,Default)
}
Add(Memory,18260,546,119)
{
Default=String(-)
AddHint(-10,-34,28,13,Default)
}
Add(StrCat,8739572,189,259)
{
link(onStrCat,13102809:doStrCat,[])
link(Str1,2932007:Value,[])
link(Str2,16688035:GetData,[(202,233)(223,233)])
}
Add(StrCat,13102809,336,259)
{
link(onStrCat,2874153:doStrCat,[])
link(Str2,7101387:Value,[])
}
Add(StrCat,2874153,392,259)
{
link(onStrCat,12580061:doStrCat,[])
link(Str2,12031991:GetData,[])
}
Add(StrCat,12580061,539,259)
{
link(onStrCat,2771292:doStrCat,[])
link(Str2,18260:Value,[])
}
Add(Convertor,15299091,259,175)
{
Mode=4
link(onResult,16688035:doData,[(303,181)(303,169)(205,169)(205,181)])
link(Data,6454270:Value,[])
}
Add(EventFromData,16688035,217,175)
{
link(onEvent,15299091:doConvert,[])
}
Add(Convertor,10840331,441,175)
{
Mode=4
link(onResult,12031991:doData,[(485,181)(485,169)(387,169)(387,181)])
link(Data,1023962:Value,[])
}
Add(EventFromData,12031991,399,175)
{
link(onEvent,10840331:doConvert,[])
}
Add(Convertor,8762883,658,182)
{
Mode=4
link(onResult,15998340:doData,[(702,188)(702,176)(604,176)(604,188)])
link(Data,14007082:Value,[])
}
Add(EventFromData,15998340,616,182)
{
link(onEvent,8762883:doConvert,[])
}
Add(StrCat,2771292,609,259)
{
link(onStrCat,6362806:doConvert,[])
link(Str2,15998340:GetData,[])
}
Add(Button,14890044,112,259)
{
Left=25
Top=15
link(onClick,8739572:doStrCat,[])
}
Add(Edit,174288,728,259)
{
Left=25
Top=50
Width=250
Text=""
}
Add(StreamConvertor,6362806,679,259)
{
Mode=2
link(onResult,174288:doText,[])
}

Редактировалось 2 раз(а), последний 2017-01-16 12:09:10
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)