Добрый день! Раньше как то не приходилось работать с 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
Этот топик читают: Гость
Ответов: 27
Рейтинг: 0
|
|||
карма: 0 |
|
Ответов: 203
Рейтинг: 2
|
|||
amateur, можно вашу схему увидеть ? Уверен что 1 на клавиатуре не есть 00000001 в байтах.
|
|||
карма: 0 |
|
Ответов: 27
Рейтинг: 0
|
|||
да, конечно. Схема тестовая, поэтому Edit-ы "Скорость" и "Шаги" не задействованы пока.
--- Добавлено в 2017-01-12 11:36:18 Я вот сейчас подумал, что пока нет осциллографа нужно наверное попробовать приходящие с компа данные в контроллер тут же отправить назад в комп и смотреть. Может это я с симулятором что то не так делаю, и программа в контроллере на самом деле правильно работает. Редактировалось 1 раз(а), последний 2017-01-12 11:36:18 |
|||
карма: 0 |
|
Ответов: 4630
Рейтинг: 749
|
|||
kaban4ik писал(а): Уверен что 1 на клавиатуре не есть 00000001 в байтах.amateur писал(а): А в окне симулятора в регистре приемника UDR вижу такую бинарную последовательность - 00110001. В десятичном представлении это цифра - 49Бекслеш и цифра после него в строковых свойствах HiAsm позволяют вводить непечатаемые символы по их кодам. В данном случае туда будет занесен символ с кодом 1 (и посланный байт будет в виде 00000001). С остальными байтами также прокатит (кроме \0, но и там можно выкрутиться). А более правильный вариант - в COMEX добавить свойство DataType, либо модифицировать Converter, чтобы он умел любые примитивные типы выдавать/принимать как строку (более точно - как тип Delphi string, состоящий из байтов, из которых состоят исходные данные). Редактировалось 1 раз(а), последний 2017-01-12 12:54:03 |
|||
карма: 26 |
|
Ответов: 8926
Рейтинг: 823
|
|||
amateur, может эта табличка осветит путь истинный
схемка
|
|||
карма: 19 |
|
Ответов: 27
Рейтинг: 0
|
|||
Netspirit, Леонид, спасибо! Склерозник я хренов, вынес себе мозг контроллером и симулятором и совсем забыл про коды клавиш, а ведь иногда сам пользуюсь таблицами кодов, когда надо вставить какой то из тех, которых нет на клавиатуре
Бонусом, схема Леонида еще и подсказала какую бинарную последовательность надо ждать, когда например перед количеством шагов для изменения направления вращения шагового двигателя нужно послать "+" или "-", то в регистре приемника UART контроллера нужно ожидать или 00101011 или 00101101, а не плюсики с минусиками Забыл добавить, ну надо же совпадение какое, я проверял 0-й бит, и в бинарном виде приходящие десятичные 49 и 48 точно совпадали с тем что я ждал... Редактировалось 1 раз(а), последний 2017-01-12 16:26:29 |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Леонид писал(а): может эта табличка осветит путь истинный и ничего не смущает? 00000000 0 ☺ 00000001 1 ☺ 00000010 2 ☻ 00000011 3 ♥ 00000100 4 ♦ Редактировалось 4 раз(а), последний 2017-01-13 10:33:09 |
|||
карма: 25 |
|
Ответов: 8926
Рейтинг: 823
|
|||
Tad, ладно придираться-то Больше печалит, что я опять биты неправильно обозначил, а ведь Galkov указывал
|
|||
карма: 19 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Tad писал(а): и ничего не смущает?Как бы не рассчитан FormatStr на непечатные символы ... И у себя у нутре использует символы #0 и #1 для собственных целей. Как реализовать эти "собственные цели" без этих ограничений, идей пока нет Редактировалось 1 раз(а), последний 2017-01-13 14:38:07 |
|||
карма: 9 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Galkov писал(а): идей пока нетЗаодно и скорость увеличится на бинарных данных с множеством #0 и #1. Редактировалось 2 раз(а), последний 2017-01-13 15:49:42 |
|||
карма: 26 |
|
Ответов: 27
Рейтинг: 0
|
|||
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 |
|
Ответов: 8926
Рейтинг: 823
|
|||
amateur, отправка/приём данных через СОМ не вызывает трудностей. Но надо чётко представлять сначала в каком виде их (данные) принимает/отправляет ваш контроллер. (Да и не забываем, что СОМ порт посылает байт 10-ю посылками, первая и последняя -- старт и окончание, восемь между ними -- значение байта.)
|
|||
карма: 19 |
|
Ответов: 27
Рейтинг: 0
|
|||
Леонид, при чтении регистра-приемника контроллера я считываю только чистые данные, тоесть 8бит или один байт, стартовый и стоповый бит в данные не вмешиваются. Я сейчас не говорю про помехи и прочее, а только так, как это должно быть в нормальном режиме работы контроллера.
Или тогда я вас просто не понял. |
|||
карма: 0 |
|
Ответов: 8926
Рейтинг: 823
|
|||
amateur, если на стороне приёмника считывается переданный байт, то какие проблемы могут быть с передачей через СОМ
Ну например: 144.9 мм =1449 шагов, в двоичной двухбайтной записи 00000101(5) старший байт, 10101001(169)младший байт схема
|
|||
карма: 19 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Леонид, проблема в том, что COMEX принимает данные в виде строки. Ему нужно вот это +100+30-55 преобразовать в строку (показано в HEX):
2B642B1E2D37
Здесь на смещение я отвел 1 байт, но если оно может быть больше 255, то нужно отводить 2 байта. 2B - знак '+', 2D - знак '-', остальное - смещение. amateur, если это так, то подобную строку можно сформировать так (StrToHex при отправке в порт не нужно):
Редактировалось 2 раз(а), последний 2017-01-16 12:09:10 |
|||
карма: 26 |
|