Если речь за код из №46, то там уже сказано - рекурсия. Ну и по стилю: сильно пахнет индусским ПХП-кодом .. попробуйте разделить мух от котлет: прием/передачу команд от исполнительного кода, должно "исчезнуть".
Сделайте так: в loop остается Serial_Report(), который продолжает заниматься контролем приема/передачи и формированием данных по пришедшей команде(цепочке). Но из него уберите проверку условия что надо что-то двигать - косвенный запуск process_input_data(), а вот её перенесите тоже в loop() после работы с командой. Все равно, пока принимаете команду - вы ничего не делаете, а как только пришла - сериал пуст. Возможно ничего и не изменится, но место задержки станет явным - прием/пересылка "вперед назад за лиловыми кроликами" - Вы каждый принятый байт отправляете обратно, а кроме того, ещё шлете в сериал .. это как правило "долго" для МК. Тем более работа через класс Ардуино.. там целая цепочка наследуется.
И ещё, кажется обратное проникновение тоже есть: из process_input_data() точно также уберите все отправки и работу с сериал, косвенные .. в loop() тоже. Исчезнет рекурсия.
Смысл такой: в loop() должно получится примерно так:
1. Если надо, то прием данных от компа;
2. Есть что исполнять - исполнение команды;
3. Надо что-то отправить - отправляем.
и далее по циклу, но не смешивая одно внутри другого.
Хотел объяснить по-человечески, но после "послушать дурачков" и отказа вникать в даташит к МК (систему прерываний которого сам же требовал вспомнить для поиска проблемы там, где ее нет), мотивируя тем, что "ардуино это не микроконтролер", считаю, что надо просто сливать воду.
Что же вы такие обидчивые?! Я разве где писал что отказываюсь вникать в даташит?! Просто в нем 435 страниц на английском языке, и я его еще не прочитал до конца. А что касается того что "ардуино это не микроконтролер", то это не я придумал! Я просто прочитал это на главной страничке данного сайта, отвечающей на вопрос "Что такое Ардуино?" и привел цитаты из нее.
sadman41 пишет:
Я, конечно, понимаю, что долгая жись в сервисмэнах отшибает мозги напрочь и без сервис-мануала, а так же консультаций вышестоящего сервис-центра, уже не чихнуть и не пернуть нормально самостоятельно не выходит. Видел даже таких, которые бита от байта не отличали и не хотели, но с умным видом лили прошивки в телики.
Не совсем правильно понимаешь! Я как раз, с 1995 и по 2013 годы, отработал в тех сервисных центрах, которые давали консультации нежестоящим сервисным центрам, и без моего последнего слова мало кто мог, как ты выразился, "чихать" и "пукать"!
sadman41 пишет:
Знакомо мне это всё - сервис-мануала нет, сонька не отвечает, потому что аппарат не на гарантии - досвидос, клиент, ваша мясорубка неремонтопригодна. А как самому что понадобилось - так все стелиться должны и искать в безумном коде ошибки, да еще и объяснять их.
Тебе просто не повезло! Ты все время общался не с авторизованными сервисными центрами, а с рекомендованными сервисными центрами. В авторизованных сервисных центрах ВСЕГДА есть не только все необходимые сервис мануалы, но и ВСЕ приложения и дополнения к ним. Раньше вся эта документация поставлялась фирмами в виде бумажных журналов, потом в виде СD или DVD дисков, а сегодня простым интернетовским доступом на сервисную страничку фирмы.
1. Алегир! Я не "зря". Это нормальная реакция на "ссылку на занятость". Тебе никто не обязан помогать. ДЕЛО НЕ В ПРЕРЫВАНИЯХ - тебе 1000 раз сказали! Остальное - ты сам должен искать косяки в твоем коде. Тебе помогают, при случае, а ты требуешь чего-то странного: "почему задержка помогает?" - да я не знаю почему! - не должна помогать. Это непредсказуемое поведение ошибочного кода. Такие ошибки очень трудно ловить.
2. Пока я не взядся за код - первые мысли - это, для начала, убрать ввод из сериала, совсем убрать. Задай последовательность G-кода, а лучше сразу координат, просто в массиве. Будет очень легко заменить функции чтения из сериала на чтение из массива.
Таким образом мы отсечем "половину пустыни", то есть возможное влияние сторонних программ по передаче и чтению сериала.
-----------------
Про пустыню - мне стыдно напоминать, но это основа инженерных изысканий: как найти льва в пустыне: 1. делим пустыню пополам решеткой, ну и так далее. В конце лев оказывается в клетке. Мне, в мои годы, в МГУ, эту шутку еще преподавали.
-------------------
так вот, за время споров и пока я не в форме (чесно говоря я просто с утра до вечера на смеси водки+феназепам+валокордин) можно провести часть исследований:
1. избавиться от рекурсии!!!!!!! и еще 100 "!"!!!! (нет ни одной реентерабельной функции, рекурсия просто гадит память и ничего не может дать)
2. убрать чтение из сериала.
3. (я так понял - уже сделано?) останавливать счет таймера в бездействии.
-----------------------------
Про даташит:
Про Ардуино у тебя сложилось неверное представление. Возможно виноват сайт... не знаю.
Ардуино это среда программирования, содержащая некоторые стандартные библиотеки и набор предкомпиляционных действий.
С точки зрения железа - это ГОЛЫЙ контроллер. Поэтому тебя и отсылаю к даташиту на контроллер. Кроме контроллера в Меге2560 есть ТОЛЬКО USB-UART интерфейс и светодиод. Стабилизатор питания и кнопку РЕСЕТ мы считать не станем... ;).
Отличия в программировании есть - среда сама ищет пути к библиотекам и позволяет использовать некоторые функции без деклараторов (Лучше б они это не делали!!!). В остальном - это просто программирование контроллера, согласно даташиту на стандартных С и С++.
Тебе просто не повезло! Ты все время общался не с авторизованными сервисными центрами, а с рекомендованными сервисными центрами. В авторизованных сервисных центрах ВСЕГДА есть не только все необходимые сервис мануалы, но и ВСЕ приложения и дополнения к ним. Раньше вся эта документация поставлялась фирмами в виде бумажных журналов, потом в виде СD или DVD дисков, а сегодня простым интернетовским доступом на сервисную страничку фирмы.
Я в курсе, не надо меня лечить. Десятки PSDS-овских дисков до сих пор помню.
Если Ваше "последнее слово" было такими же, как и код, который суда вывалили, то я удивлен, как в сервисах умудряются вобще хоть что-то чинить, а не тупо меняют все блоками, как папуасы.
я удивлен, как в сервисах умудряются вобще хоть что-то чинить, а не тупо меняют все блоками, как папуасы.
Ради честности следует сказать, что в авторизованных СЦ, по кр. мере что касается ноутов, просто запрещено проводить ремонт агрегатов, даже если паяльная станция позволяет менять чипы BGA (например). Это политика вендора. Платы собрать и отправить вендору, новые - -ставить. Паять запрещено, только поагрегатная замена.
Мне было смешно.... я логику понимаю...но все равно смешно.
Если речь за код из №46, то там уже сказано - рекурсия. Ну и по стилю: сильно пахнет индусским ПХП-кодом .. попробуйте разделить мух от котлет: прием/передачу команд от исполнительного кода, должно "исчезнуть".
За корявость представленного кода извиняюсь. Я хоть и не индус, но тоже не являюсь носителем языка, с рождения владеюшим его нормами. У меня пока "как слышиться, так и пишется".
Arhat109-2 пишет:
Сделайте так: в loop остается Serial_Report(), который продолжает заниматься контролем приема/передачи и формированием данных по пришедшей команде(цепочке). Но из него уберите проверку условия что надо что-то двигать - косвенный запуск process_input_data(), а вот её перенесите тоже в loop() после работы с командой. Все равно, пока принимаете команду - вы ничего не делаете, а как только пришла - сериал пуст. Возможно ничего и не изменится, но место задержки станет явным - прием/пересылка "вперед назад за лиловыми кроликами" - Вы каждый принятый байт отправляете обратно, а кроме того, ещё шлете в сериал .. это как правило "долго" для МК. Тем более работа через класс Ардуино.. там целая цепочка наследуется.
Спасибо за совет! Я тоже думал в этом направлении, но меня сбила с толку реакция кода на ввод в подпрограмму обработки прерывания строки с задержкой на 200 мкс.
1. Алегир! Я не "зря". Это нормальная реакция на "ссылку на занятость".
Вообше-то я отвечал на твое сообщение, и общался с тобой, а не с кем-то другим обсуждал трудности общения в сегодняшнем интернете.
wdrakula пишет:
Тебе никто не обязан помогать.
А я об этом уже писал в своем сообщении с номером 86
Хочешь и знаешь - отвечаешь! Не хочешь или НЕ знаешь - ничего и НЕ отвечаешь!
wdrakula пишет:
Тебе помогают, при случае, а ты требуешь чего-то странного: "почему задержка помогает?" - да я не знаю почему! - не должна помогать. Это непредсказуемое поведение ошибочного кода. Такие ошибки очень трудно ловить.
Я ничего не требую, и свой код предпочитаю проверять сам, понимая что мои проблемы это только МОИ проблемы. Просто я тоже думал что введенная мной задержка не должна была радикально повлиять на поведение кода, а она взяза и выдала свою "загогулину"!
wdrakula пишет:
2. Пока я не взядся за код - первые мысли - это, для начала, убрать ввод из сериала, совсем убрать. Задай последовательность G-кода, а лучше сразу координат, просто в массиве. Будет очень легко заменить функции чтения из сериала на чтение из массива.
Таким образом мы отсечем "половину пустыни", то есть возможное влияние сторонних программ по передаче и чтению сериала.
Я не думаю, что это удачное предложение! Я все-таки хочу в лесу грибы и ягоды собирать, а не в песчанной постыне за тушканчиками и скорпионами наблюдать!
wdrakula пишет:
-----------------
Про пустыню - мне стыдно напоминать, но это основа инженерных изысканий: как найти льва в пустыне: 1. делим пустыню пополам решеткой, ну и так далее. В конце лев оказывается в клетке. Мне, в мои годы, в МГУ, эту шутку еще преподавали.
-------------------
Мне тоже. в мои годы учебы в МЭИ, преподаватель высшей математики говорил - "Вы вечерники, и я учу вас думать, а не умничать!", когда мы проходили тройные интегралы. И рассказал байку о том как Эдисон набирал в свою лабораторию специалистов.
Эдисон давал кандидату колбу от изобретенной им лампочки и просил измерить ее внутренний объем, разрешая пользоваться всем тем что кандидат увидит в лаборатории. Если кандидат брал в руки лист бумаги, карандаш, логарифмическую линейку и штангельциркуль, то Эдисон просил кандидата обосновать свой выбор нужных ему предметов и рассказать о стратегии вычислений. Когда кандидат начинал говорить о том что он сначала мысденно разобъет колбу на элементарные геометрические фигуры (шар, цилиндр, усеченный конус) штангельциркулем измерит их размеры, возьмет тройные интегралы каждой фигуры и логарифмической линейкой будет вычислять их объемы, Эдисон сразу говорил кандидату что он ему не подходит, и рекомендовывал кандидату искать работу в бухгалтерских конторах. На вопроос кандидата "Почему?" Эдисон отвечал "Я вижу что вы умеете вычислять, а мне нужен человек который умеет думать! Эту задачу можно решить быстрее и точнее" После чего Эдисон брал колбу лампочки, из рукомойника наливал в нее воды до краев и переливал воду из колбы в измерительную мензуру!
wdrakula пишет:
Про даташит:
Про Ардуино у тебя сложилось неверное представление. Возможно виноват сайт... не знаю.
Ардуино это среда программирования, содержащая некоторые стандартные библиотеки и набор предкомпиляционных действий.
С точки зрения железа - это ГОЛЫЙ контроллер. Поэтому тебя и отсылаю к даташиту на контроллер. Кроме контроллера в Меге2560 есть ТОЛЬКО USB-UART интерфейс и светодиод. Стабилизатор питания и кнопку РЕСЕТ мы считать не станем... ;).
Отличия в программировании есть - среда сама ищет пути к библиотекам и позволяет использовать некоторые функции без деклараторов (Лучше б они это не делали!!!). В остальном - это просто программирование контроллера, согласно даташиту на стандартных С и С++.
Особенности контроллеров на сайте Атмела, на 2560 ссылку я давал. В IDE есть каталог с ядром: hardware/arduino/avr/cores/arduino
Там можно посмотреть все "гадости" которые с контроллером делает среда! ;) ;) ;). Там настройки таймеров, АЦП и прочие мелочи.
Правильно ли я понял, что если Ардуино с точки зрения железа - это ГОЛЫЙ контроллер. А я уже прочитал даташиты на PIC контроллеры и микроконтроллеры Renesas, то мне уже не надо читать даташит на микроконтроллеры Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V, и надо только узнать какие "гадости" с контроллером делает среда?
Я в курсе, не надо меня лечить. Десятки PSDS-овских дисков до сих пор помню.
Так тебя никто и не лечит! Тебе просто выразили сожаление!
sadman41 пишет:
Если Ваше "последнее слово" было такими же, как и код, который суда вывалили, то я удивлен, как в сервисах умудряются вобще хоть что-то чинить, а не тупо меняют все блоками, как папуасы.
Мое "последнее слово" не могло быть таким же, как и код, который я вывалил сюда! Там я был профессионалом, а тут я являюсь продвинутым дилетантом!
А удивляться тому, что в некоторых сервисах еще умудряются вобще хоть что-то чинить, не надо. Не все еще настоящие мастера ушли на пенсию!
Ради честности следует сказать, что в авторизованных СЦ, по кр. мере что касается ноутов, просто запрещено проводить ремонт агрегатов, даже если паяльная станция позволяет менять чипы BGA (например). Это политика вендора. Платы собрать и отправить вендору, новые - -ставить. Паять запрещено, только поагрегатная замена.
Мне было смешно.... я логику понимаю...но все равно смешно.
На платных ремонтах никто никому ничего не запрещает!!! А вот на гарантийных ремонтах глубина ремонта определяется категорией сервисного центра. Одним сервисным центрам действительно запрещается ремонтировать на компонентном уровне, другим разрешено. АСЦ при торговых фирмах, как правило нацелены на гарантийные ремонты, и не любят выполнять платные. Сервисные отношения вендора с производителем определяются индивидуальными договорами. Чем больше закупаешь и продаешь, тем проше отношения и с сервисными обязательствами производителя перед продавцом. Хочешь ремонтировать на блочном уровне и получать за это копейки - меняй! Только покупай вагонами, а не "газелькой", и не химич с платными ремонтами. (Это когда блоки с платных ремонтов вписываются в гарантийные отчеты, и фирма производитель возвращает сервисному центру их закупочную стоимость) Хочешь ремонтировать на компонентном уровне и зарабатывать на этом рубли, покупай рекомендованное оборудование и ремонтируй.
Когда, на заре становления сервисного центра, мой первый шеф спросил представителя фирмы - "Почему у вас такие низкие расценки на гарантийный ремонт?", сетуя на то что на таких расценках ничего не заработаешь, ему ответили - "Ваши доходы это наши расходы! И мы надеемся, что зарабытывать вы будете не на нас, а на тех возможностях, которые мы вам предоставляем нашей авторизацией!".
Правильно ли я понял, что если Ардуино с точки зрения железа - это ГОЛЫЙ контроллер.
Нет.
Вы совершенно верно цитировали, что есть Ардуино.
Вкратце: Ардуино - это концепция, которая за счет отказа от значительной части возможностей различных контроллеров позволяет унифицировать работу с ними.
Если мы делаем сравнительно простую конструкцию, оставшихся ограниченных возможностей, как правило, хватает для ее реализации. Но если нам нужна система посложнее, то той ограниченной функциональности, что обеспечивает концепция Ардуино, нам оказывается недостаточно. И единственный выход - отказаться от концепции Ардуино и начать адаптировать проект под конкретный контроллер. И в этом случае нам нужен дэйташит на этот контроллер вместо документации на Ардуино. Но это уже, строго говоря, не Ардуино, даже если мы используем контроллер, на котором написано Arduino, и программируем его с помощью Arduino IDE.
Правильно ли я понял, что если Ардуино с точки зрения железа - это ГОЛЫЙ контроллер. А я уже прочитал даташиты на PIC контроллеры и микроконтроллеры Renesas, то мне уже не надо читать даташит на микроконтроллеры Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V, и надо только узнать какие "гадости" с контроллером делает среда?
Нет конечно! Какое отношение PIC или Renesas имеют к AtMega2560? Тут, на нашем сайте, есть принципиальная схема Mega2560. Посмотри, там нет ничего, кроме контроллера, вот его мы и программируем, а Андриано - программирует Ардуино ;) - кто ж ему помешает ? ;) У нас пока свободная страна.
-----
И да, Андриано, как обычно, несет пафосную чушь ни о чем. Но может я не в силах оценить глубину его мысли? Тогда сорри ;).
Я так, для сведения, напишу для Андриано: ТС УЖЕ использует НЕ Ардуино, так как в Ардуино нет ISR() ;) ;) ;).
===================
Да, по делу:
Я уже понемногу слезаю с транквилизаторов... жизнь все-таки продолжается... так что давай искать ошибку.
1. Понимаешь, в непредсказуемом коде искать ошибку очень непросто. Я не предлагаю тебе отказываться от каких-то частей, но избавиться НА ВРЕМЯ от сериала - необходимо. Это не навсегда, потом вернем обязательно, но нужно найти чертов баг!!!
2. Самое первое - убери, плз, рекурсию... Я просто подожду версии кода без рекурсии, пока она есть, говорить о любом поведении программы - не имеет смысла, как о погоде в Занзибаре. Я понимаю, что она случайно получилась. И не гоню на "новичка"... Но код твой. Ты имеешь в голове некую концепцию - ты и изменяй код. Если стану править я - это будет мой код :).
3. Не совсем ясна твоя идея о работе с обоими двигателями одним таймером: а если по X равномерно вперед, а по Y - пила?
Поясни, если не трудно... это пока не касается кода, скорее вызывает замешательство.
Концептуально у него всегда только одна из двух осей работает.
А рекурсии - последствия передозировки ассемблером или иными тяжелыми наркотиками: переменные - глобалы,функции без параметров, вызов функции рассматривается как jmp, без оценки последствий такого приема.
Концептуально у него всегда только одна из двух осей работает.
Если под осями ты подразумеваешь работу двигателей, то концептуально у меня почти всегда (99.9%) работают ДВЕ оси. Я в своем проекте использую кинематику"AxiDraw", поэтому даже тогда когда перемешение происходит строго по оси "X" или по оси "Y", у меня работают два мотора! Один мотор работает только тогда, когда перемещение происходит под диагонали с улом 45 градумов.
sadman41 пишет:
А рекурсии - последствия передозировки ассемблером или иными тяжелыми наркотиками: переменные - глобалы,функции без параметров, вызов функции рассматривается как jmp, без оценки последствий такого приема.
Это не последствия передозировки ассемблером, а авторский почерк художника старой школы! Я, как-никак обучался в 70-х, и свои отношения с вычислительной техникой начинал с машинных кодов и ассемблера.
Вкратце: Ардуино - это концепция, которая за счет отказа от значительной части возможностей различных контроллеров позволяет унифицировать работу с ними.
Если мы делаем сравнительно простую конструкцию, оставшихся ограниченных возможностей, как правило, хватает для ее реализации. Но если нам нужна система посложнее, то той ограниченной функциональности, что обеспечивает концепция Ардуино, нам оказывается недостаточно. И единственный выход - отказаться от концепции Ардуино и начать адаптировать проект под конкретный контроллер. И в этом случае нам нужен дэйташит на этот контроллер вместо документации на Ардуино. Но это уже, строго говоря, не Ардуино, даже если мы используем контроллер, на котором написано Arduino, и программируем его с помощью Arduino IDE.
Правильно ли я понял ваш намек, что если человек делает систему посложнее мырга светодиодом, то ему не стоит задавать свои вопросы на форуме сайта arduino.ru?
Я уже понемногу слезаю с транквилизаторов... жизнь все-таки продолжается... так что давай искать ошибку.
1. Понимаешь, в непредсказуемом коде искать ошибку очень непросто. Я не предлагаю тебе отказываться от каких-то частей, но избавиться НА ВРЕМЯ от сериала - необходимо. Это не навсегда, потом вернем обязательно, но нужно найти чертов баг!!!
Что ты подразумеваешь под словом "сериал"?
wdrakula пишет:
2. Самое первое - убери, плз, рекурсию... Я просто подожду версии кода без рекурсии, пока она есть, говорить о любом поведении программы - не имеет смысла, как о погоде в Занзибаре. Я понимаю, что она случайно получилась. И не гоню на "новичка"... Но код твой. Ты имеешь в голове некую концепцию - ты и изменяй код. Если стану править я - это будет мой код :).
А если я буду править свой код под тебя, то это уже будет не мой проект, а твой, написанных мною под твоим руководством!
wdrakula пишет:
3. Не совсем ясна твоя идея о работе с обоими двигателями одним таймером: а если по X равномерно вперед, а по Y - пила?
Поясни, если не трудно... это пока не касается кода, скорее вызывает замешательство.
Это обусловлено тем, что я использую кинематику AxiDraw (см https://habr.com/post/393535/ ) а в ней движение по вертикали или горизонтали обеспечивается не одним движком, а двумя. Работа одного движка производит только движение под диагонали, по углом 45 градусов.
То, что полностью лежит внутри концепции Ардуино, описано в документации. А форум - он для "около-Ардуиновских" тем. В том числе и для обмена опытом общения с конкретными контроллерами. Включая те, что официально Ардуино не поддерживаются (например, stm32duino).
А по поводу намека - он был на то, что никто даже не планировал размещать на сайте Ардуино всю документацию, которая может понадобиться для конкретного проекта, даже если в основе проекта лежит плата Ардуино.
Вкратце: Ардуино - это концепция, которая за счет отказа от значительной части возможностей различных контроллеров позволяет унифицировать работу с ними.
Если мы делаем сравнительно простую конструкцию, оставшихся ограниченных возможностей, как правило, хватает для ее реализации. Но если нам нужна система посложнее, то той ограниченной функциональности, что обеспечивает концепция Ардуино, нам оказывается недостаточно. И единственный выход - отказаться от концепции Ардуино и начать адаптировать проект под конкретный контроллер. И в этом случае нам нужен дэйташит на этот контроллер вместо документации на Ардуино. Но это уже, строго говоря, не Ардуино, даже если мы используем контроллер, на котором написано Arduino, и программируем его с помощью Arduino IDE.
Правильно ли я понял ваш намек, что если человек делает систему посложнее мырга светодиодом, то ему не стоит задавать свои вопросы на форуме сайта arduino.ru?
Да неужели дошло?!? Не верю! :)
Ардуино - это не микроконтроллер, и даже не плата, сделанная на основе Atmel микроконтроллера когда-то давным-давно и даже не ИДЕ с его кривовастыми библотеками иподходом "скозной нумерации пинов", несмотря на то, что практически каждый пин заточен под исключительно свое применение!
Ардуино - это совокупность всего этого, имеющая наипервейшую цель .. ОБУЧЕНИЕ НОВИЧКОВ и .. ничего больше. ЕДИНСТВЕННУЮ.
Как только, Вы полезли в "даташит", как только Вы начали использовать макросы "io.h" (TCCRA, ISR) как-только Вы пытаетесь что-то "допаять" .. всё, Вы вышли на иной "уровень" .. и ссылаться на "Ардуино" - не верно. У вас есть некая "отладочная плата" (может и с маркировкой "Ардуино"), на которой есть некий микроконтроллер, и ЗАДАЧА, которая решается ОБЩИМИ средствами .. и "Ардуино" - тут не приделах. Так, по инерции..
И вот тут уже, для решения вашей задачи, да .. даташит, компилятор, io.h и все остальные "серьезные" вопросы. И уже не на этом сайте. :)
(* меня тоже долго удивляло, почему тут бесполезно задавать вопросы сложнее ногодрыга .. впрочем пробегитесь по моим темам .. там всё наглядно. *)
То, что полностью лежит внутри концепции Ардуино, описано в документации. А форум - он для "около-Ардуиновских" тем. В том числе и для обмена опытом общения с конкретными контроллерами. Включая те, что официально Ардуино не поддерживаются (например, stm32duino).
А по поводу намека - он был на то, что никто даже не планировал размещать на сайте Ардуино всю документацию, которая может понадобиться для конкретного проекта, даже если в основе проекта лежит плата Ардуино.
тот объем, что размещен в разделах "Программирование" и "Контроллеры Ардуино", тоже читать не принято.
Ввод через последовательный порт. Ты придуривашься? Не стоит.
ALEGYR пишет:
А если я буду править свой код под тебя, то это уже будет не мой проект, а твой, написанных мною под твоим руководством!
Страдаешь от коммуникативной депривации? Я тебе говорю не как код переделывать, а как ошибку найти. Потом возвращай все, как желаешь. Ты понимаешь как искать ошибку или ее должен искать я? Я обещаю помочь найти ошибку, если ты не споришь. Я не ПЕРЕДЕЛЫВАЮ твой код, говорю, как его сократить и изменить не для его лучшей работа, а для изоляции ошибки.
Понимаешь ли ты, что факт влияния задержки в ISR() на работу кода - это и есть ДИАГНОСТИЧЕСКИЙ признак ошибки в коде? Вот эту ошибку мы и ищем. Пиши свой код - как хочешь. Он очень кривой, но это не мое дело. Я даже не лезу в саму логику - мне это не нужно, я говорю об изменениях, ВРЕМЕННЫХ ИЗМЕНЕНИЯХ, в целях локализации ошибки.
Или мы друг-друга не поняли?
На твой вопрос в первом посте: "почему влияет задержка?" - я отвечаю - "не знаю!". Это признак ошибки в коде. Я готов показать тебе последовательность действий, которые помогут ТЕБЕ САМОМУ найти эту ошибку. Я не стану ее искать сам. Если устраивает - выполни задания: убрать сериал и рекурсию и снова снять сигнал логаналайзером.
Данные на почту: мой ник на жмейле.
ALEGYR пишет:
Это обусловлено тем, что я использую кинематику AxiDraw (см https://habr.com/post/393535/ ) а в ней движение по вертикали или горизонтали обеспечивается не одним движком, а двумя. Работа одного движка производит только движение под диагонали, по углом 45 градусов.
Ты не на мой вопрос отвечал. :) Я спросил: как ОДИН таймер должен обслуживать ДВА двигателя?
Впервые я сюда заглянул в 2013 году, когда узнал про ардуину. И первое мое впечатление было что это сайт для детей и людей, которые мало чего знают про элетронику и программирование микроконтроллеров, но хотят приобщится к этому. Я понял, что этот сайт, приобщая детей и людей к электронике, занимается хорошим делом, но это не то что мне нужно. Я запомил его в своих закладках, и пошел в гугл и даташиты.
Гуляя в гугле, я понял что в нашей стране ардуину любят только любознательные дети, и взрослые, не имеющие отношение ни к программированию, ни к электронике. Профессионалы ее либо явно ненавидят (обычно этим занимаются вчерашние новички, прочитавшие даташит на пару страниц больше чем ребенок или врослый-дилетант), либо относятся к ардуине (и ее поклонникам) свысока.
Видя такое дело, и столкнувшись со своей метаморфозой, я подумал что за пять лет у ардуины могли появится квалифицированные специалисты, и на форуме сайта ардуины могли произойти серьезные изменения. Заглянув на форум, я увидел что тут люди стали даже деньги на этом зарабатывать! Но оказалось, что тех кто тут что-то зарабатывает почти нет, и они тут обычно не тусуются, а те кто тусуются, они ничего не зарабатывают, а только хотят зарабатывать, и заходят на форум чтобы стайкой почмурить заказчиков, и поглумится над новичками, советуя им начать с похода в гугл и чтения даташита.
Заглянув на форум, я увидел что тут люди стали даже деньги на этом зарабатывать! Но оказалось, что тех кто тут что-то зарабатывает почти нет, и они тут обычно не тусуются, а те кто тусуются, они ничего не зарабатывают,
Да, ты прав - заказов с этого сайта лично у меня - единицы. В большинстве случаев потому, что - либо потенциальный проект неинтересен по некоторым причинам, либо потому, что после первого общения заказчик оказывается просто "мимо проходил, поинтересовался". Плюс - ещё потому, что за доширак и без предоплаты не работаю.
С той же амперки - заказов сильно больше, не сказать, что прям на них можно безбедно жить, но вполне себе доход для поддержания штанов.
Ввод через последовательный порт. Ты придуривашься? Не стоит.
Я не придуриваюсь, а уточняю, чтобы не было недопонимания!
Последовательный порт я убрать не могу! Так как обработка заранее заданного массива данных и обработка данных поступающих через последовательный прорт это две разные техничекские технические задачи!!!
wdrakula пишет:
ALEGYR пишет:
А если я буду править свой код под тебя, то это уже будет не мой проект, а твой, написанных мною под твоим руководством!
Страдаешь от коммуникативной депривации? Я тебе говорю не как код переделывать, а как ошибку найти. Потом возвращай все, как желаешь. Ты понимаешь как искать ошибку или ее должен искать я? Я обещаю помочь найти ошибку, если ты не споришь. Я не ПЕРЕДЕЛЫВАЮ твой код, говорю, как его сократить и изменить не для его лучшей работа, а для изоляции ошибки.
Понимаешь ли ты, что факт влияния задержки в ISR() на работу кода - это и есть ДИАГНОСТИЧЕСКИЙ признак ошибки в коде? Вот эту ошибку мы и ищем. Пиши свой код - как хочешь. Он очень кривой, но это не мое дело. Я даже не лезу в саму логику - мне это не нужно, я говорю об изменениях, ВРЕМЕННЫХ ИЗМЕНЕНИЯХ, в целях локализации ошибки.
Или мы друг-друга не поняли?
Я действительно тебя не понимаю, когда ты просто говоришь сократи свой код, а потом начинаешь спрашивать зачем у тебя один таймер работает на два мотора!
Вот Arhat109-2 я сразу понял, когда он написал в своем сообщении с номером 101
Arhat109-2 пишет:
Сделайте так: в loop остается Serial_Report(), который продолжает заниматься контролем приема/передачи и формированием данных по пришедшей команде(цепочке). Но из него уберите проверку условия что надо что-то двигать - косвенный запуск process_input_data(), а вот её перенесите тоже в loop() после работы с командой. Все равно, пока принимаете команду - вы ничего не делаете, а как только пришла - сериал пуст. Возможно ничего и не изменится, но место задержки станет явным - прием/пересылка "вперед назад за лиловыми кроликами" - Вы каждый принятый байт отправляете обратно, а кроме того, ещё шлете в сериал .. это как правило "долго" для МК. Тем более работа через класс Ардуино.. там целая цепочка наследуется.
И ещё, кажется обратное проникновение тоже есть: из process_input_data() точно также уберите все отправки и работу с сериал, косвенные .. в loop() тоже. Исчезнет рекурсия.
Смысл такой: в loop() должно получится примерно так:
1. Если надо, то прием данных от компа;
2. Есть что исполнять - исполнение команды;
3. Надо что-то отправить - отправляем.
и далее по циклу, но не смешивая одно внутри другого.
wdrakula пишет:
На твой вопрос в первом посте: "почему влияет задержка?" - я отвечаю - "не знаю!". Это признак ошибки в коде. Я готов показать тебе последовательность действий, которые помогут ТЕБЕ САМОМУ найти эту ошибку. Я не стану ее искать сам. Если устраивает - выполни задания: убрать сериал и рекурсию и снова снять сигнал логаналайзером.
Данные на почту: мой ник на жмейле.
Мне твой подход напомнил байку, которую я услышал от преподавателя физики, когда он объяснял студентам чем отличаются подходы физика и математика к решению одной и той же задачи.
Физику и математику ставаят одну и ту же задачу - "Вы были на рыбалке. У вас есть пустое ведро, река и горящий костер. Вы возвращаетесь домой, и вам надо потушить костер. Ваши действия?"
физик и математик сказали что надо взять ведро, набрать из реки воды и вылить воду на костер.
Тосле этого им ставаят ту же задачу, но с несколько измененными условиями - "Вы были на рыбалке. У вас есть ведро с водой, река и горящий костер. Вы возвращаетесь домой, и вам надо потушить костер. Ваши действия?"
Физик отвечает что надо взять ведро с водой и вылить воду на костер.
Математик отвечает что надо подумать! И начинает думать - если нам надо потушить костер, то нам надо залить его водой. Воду мы может набрать из реки, но ведро занято! А если ведро занято, то мы не сможем потушить костер. Если мы будем использовать уже налитую воду в ведре, то мы не сможем использовать воду в реке, а она нам задана по условию задачи! Получается какая-то фигня, и тут явно есть ошибка в исходных данных. Поняв это он говорит экзаменатору что задачка не решаема, так как в ней есть избыточные данные, которые явно мешают решению задачи! Экзаменатор говорит - а вы поробуйте оптимизировать исходные данные. Математик - Ну если можно оптимизировать исходные данные, то надо просто вылить воду из ведра, и тогда решение задачки сведется к решению предыдущей!
wdrakula пишет:
Ты не на мой вопрос отвечал. :) Я спросил: как ОДИН таймер должен обслуживать ДВА двигателя?
Это не касается ошибки, просто любопытство.
На горизонтальных и вертикальных перемещениях два движка вращаются с одинаковым скоростями, и им не нужен еще один таймер!
Чего ж ты мозги детям и непрофессионалам-то канифолишь? Сходил бы на форум профессионалов - чего зря время терять. Давно бы уж своей гениальной прошивкой крутил моторы - профи же тебе сразу подсказали, какие две строчки местами поменять чтобы дырок в степе не было.
Чего ж ты мозги детям и непрофессионалам-то канифолишь? Сходил бы на форум профессионалов - чего зря время терять. Давно бы уж своей гениальной прошивкой крутил моторы - профи же тебе сразу подсказали, какие две строчки местами поменять чтобы дырок в степе не было.
Так меня попросили отметится в серьезных разделах форума, и не мешаться в разделе отвлеченных тем и поиска исполнителей! Вот я и решил пообщаться с серьезными людьми на серьезные темы. Оказалось что их тут немного, но они есть!
Я же не говорю - убрать ввод совсем. Я прошу проверить, КАК ВВОД влияет. Если "стук" пропадет", то ясно, что нужно оптимизировать ввод, если не пропадет, то нужно оптимизировать что-то другое.
Ты просто споришь на пустом месте, зачем? Ведь давно бы все нашли. Да и так давно ясно, что дело в рекурсивном вызове Serial_Report() в 296 строке. Но нужно нормальное поддтверждение. Таким подтверждением будет пропадание "стука" при отключении ввода из сериал-порта.
Получив это подтверждение - станем двигаться дальше. Уже сказать как и куда? Считыванием и интерпретацией блока кода заранее. Памяти в Меге, слава Б..гу, достаточно. Блин! Ты правда хочешь, чтобы за деда с седыми мудями, другой дед, с такими же мудями ;) , код писал? Если нет, то просто сделай, как я говорю, ДЛЯ ПРОВЕРКИ ДИАГНОЗА, а потом пиши, как угодно, хоть со всеми переменными в глобале, только без рекурсии, плз. ОК? ;)
А рекурсию убери, она у тебя всю память съест и переменные перемешает. Да хоть как Архат тебе написал переделай, но без рекурсии.
Про моторы понял - в твоем станке не бывает перемещений с разными скоростями, ОК.
Мы топчемся на месте потому, что один дед с седыми мудями, говорит другому деду с седыми мудями - "Сделай так как я тебя прошу!", и не хочет написать трех строчек кода КАК и ГДЕ ему надо изменить код, чтобы проверить его задумку! А другой дед с седыми мудями, видя свой корявый код и не видя нужных трех строчек кода, не понимает КАК и КУДА надо внести изменения, что бы не убирать ввод совсем, и проверить пропадет стук после этого или нет! Чтобы получив подтверждение мсыли первого деда - двигаться дальше.
wdrakula пишет:
Про моторы понял - в твоем станке не бывает перемещений с разными скоростями, ОК.
В моем "станке" все бывает, и перемешение с разными соростями, и перемещения в разных направлениях, и перемещение по дуге. Просто ты просил сделать маленькую программу, вот я и убрал из нее пару-тройку килобайт прошивки.
Чтобы не собирать обо мне информацию, но представлять меня и что и когда я могу:
рожден 19.11.1969, Москва, школа-матшкола-МехМат МГУ, кафедра мат.логики
Женат, сын, внучка.
150+ кг, диабет 2, сердце (ИБС).
не работаю вообще и не зарабатываю, рантье.
Живу круглый на сталинской даче в Раменском (Кратово).
Много травм - от спорта, и лощадки и мотоцикл... До сих пор упертый байкер, до самого снега.
----------------------------
Я не сильно здоровый человек - рано ложусь и поздно встаю... с 6 вечера - уже ужин и самогон ;).
Я про себя пояснил, чтобы было понятно, чего от меня можно ждать.
Ну если чтобы было понятно, чего от меня можно ждать, то мне так в жизни не повезло!
Я в 1976 году только окончил техникум (почти с красным дипломом) и поступил в МЭИ на вечерний факультет Автоматики и вычислительной техники. После окончания техникума по распределению был направлен в ГосНИИЭРАТ граждданской авиации, где впервые увидел ЭВМ МИР-2 ( см http://ru.pc-history.com/evm-mir-2.html ), которую мне пришлось обслуживать (выявлять отказы ТЭЗов и ремонтировать их)
C 12.11.1976 по 12.11.1978 служил в армии в Приморском крае. Где служил на должности прапорщика и все два года занимался ремонтом телефонной и телеграфной аппаратуры ЗАС со всей тамошней армии, получая за это все 24 месяца службы по 20 р 80 коп ежемесячно. (те кто служил знают что это такое)
После дембеля, С 1979 по 1981 годы, работал в пуско-наладочном управлении с названием "СпецЭВМ комплекс", и запускал по всей России автоматизированные рабочие места проектировщиков (АРМ-П и АРМ-М) на баэе малых ЭВМ "М400" и "СМ3" ( см рисунок 10 на http://www.computer-museum.ru/articles/sm-evm/1026/ )
До 1985 года (пока учился в МЭИ) работал на эксплуатации ЕС ЭВМ
C 1985 по 1995 годы работал в одном из московских НИИ, где c 1987 года, будучи уже ведущим инженером, занимался разработкой электронных средств контроля и тестирования для специальных вычислительных машин.
Ну а о том, что было дальше я уже тут писал.
Могу только добавить, что имею вес около 90 кг и рост выше среднего (186 см). Спортом никогда не занимался, но имею грамоты от различных учебных заведений за победу в соревнованиях по бегу на средние дистанции, по прыжкам в высоту и по плаванию. Обладаю вокальными данными, но после 50 лет почти не пою.
Я писал про себя, не для того, чтобы "оголиться перед партией" ;), а для того, чтобы было понятно, что я мало часов в день могу посвятить чужим проблеммам, и почему это так. Чтобы ты снова не винил меня в отговорках.
---------------------------
Ладно. Я кажется нашел где задержка у тебя. Но править ее... Не обижайся... я правда долго думал, как исправить, не ломая твой код. Не придумал.
Вот сама причина: (будет многословно)
Ты планировал "склеивать" два совместимых по направлению G-кода, так? И читать следующий код, пока движется каретка на прерываниях, я прав?
функция ready() перед чтением вызывается, я проверил. Остается одно - комп не отдает следующий код так быстро. Если ты добавляешь 200 мкc * 10*100 шагов = 200 мс, то комп успевает отдать, а ардуинка обработать следующий G-код.
Проверь, если не трудно:
начало Serial_report() заменяешь на
while ( InputStrPtr < sizeof(InputStr)) {
char c = InputStr[InputStrPtr++];
//Serial.print(c);
в сетапе комментируешь Serial.begin и в ready() Serial.print - тоже комментируешь.
добавляешь ДВЕ глобальные переменные:
int InputStrPtr = 0;
char InputStr[] = "тут \n просто \n пишешь свой G-код разделяя его \n";
Я писал про себя, не для того, чтобы "оголиться перед партией" ;), а для того, чтобы было понятно, что я мало часов в день могу посвятить чужим проблеммам, и почему это так. Чтобы ты снова не винил меня в отговорках.
Я понял, что ты хотел написать о том что занятый и не совсем здоровый человек. Меня просто сбили с толку твои слова про школу-матшколу-МехМат МГУ, кафедру мат.логики и круглогодичную жизнь на сталинской даче в Раменском (Кратово).
wdrakula пишет:
Ладно. Я кажется нашел где задержка у тебя. Но править ее... Не обижайся... я правда долго думал, как исправить, не ломая твой код. Не придумал.
Вот сама причина: (будет многословно)
Ты планировал "склеивать" два совместимых по направлению G-кода, так? И читать следующий код, пока движется каретка на прерываниях, я прав?
Да! Я склеиваю до 40-ка совместимых по направлению G-кодов.
функция ready() перед чтением вызывается, я проверил. Остается одно - комп не отдает следующий код так быстро. Если ты добавляешь 200 мкc * 10*100 шагов = 200 мс, то комп успевает отдать, а ардуинка обработать следующий G-код.
Комп все отдает как надо. В своем сообшении под номером 55 я дал две картинки с логического анализатора, и на нижней картинке четко видно что комп успевает передать все G-коды склеиваемых сегментов почти за первые 50 милисекунд движения по первому сегменту, а разрывы в склейках появляются на 150 мс, на 250 мс, на 350 мс и на 450 мс! А что касается добавления задержки в 200 мкс, то она свое воздействие оказывает всего ОДИН раз за все шаги сегмета, а не по формуле "200 мкc * 10*100 шагов = 200 мс"!!!
wdrakula пишет:
Проверь, если не трудно:
начало Serial_report() заменяешь на
while ( InputStrPtr < sizeof(InputStr)) {
char c = InputStr[InputStrPtr++];
//Serial.print(c);
в сетапе комментируешь Serial.begin и в ready() Serial.print - тоже комментируешь.
добавляешь ДВЕ глобальные переменные:
int InputStrPtr = 0;
char InputStr[] = "тут \n просто \n пишешь свой G-код разделяя его \n";
Обязательно проверю! Но только немного попозже. Я сейчас реализовываю рекомендацию от Arhat109-2, которую он дал в своем сообщении под номером 101.
Обязательно проверю! Но только немного попозже. Я сейчас реализовываю рекомендацию от Arhat109-2, которую он дал в своем сообщении под номером 101.
Это правильно! Если ты, при этом, избавишься от рекурсии - возможно все исправится само.
Да, ты прав, 200 мкс работают 1 раз. тогда влияния вообще никакого не должно быть, только разная работа оптимизатора при компиляции. Посмотрим. Даже любопытно становится.
Я понял, что ты хотел написать о том что занятый и не совсем здоровый человек. Меня просто сбили с толку твои слова про школу-матшколу-МехМат МГУ, кафедру мат.логики и круглогодичную жизнь на сталинской даче в Раменском (Кратово).
Ну ведь не на Рублевке же!!! Это старые участки, я живу в щитовом летнем доме (который я покрыл вагонкой, пенопластом и матюгами ;) ), который построен в 1934 году... со всемы щелями и размерарами... так что "повезло", это не совсем верный термин, ИМХО.
int InputStrPtr = 0;
char InputStr[] =
"G0 X0.000 Y10.000'\n'"
"G0 X0.000 Y20.000'\n'"
"G0 X0.000 Y30.000'\n'"
"G0 X0.000 Y40.000'\n'"
"G0 X0.000 Y50.000'\n'" ; //"тут \n просто \n пишешь свой G-код разделяя его \n"
и в Serial_Report ()
while ( InputStrPtr < sizeof(InputStr)) {
char c = InputStr[InputStrPtr++];
//while ( Serial.available() > 0) { // пока в буфере приема есть принятый байт, то
// char c = Serial.read(); // считываем его в переменную "char c"
закоментировал в сетапе
//Serial.begin(57600); //
Calculation_max_count_Acceleration_(); // создаем массив задержек для разгона и торможения
//ready(); // отсылаем в комп ">" (тут это как код готовности)
Результат ОТРИЦАТЕЛЬНЫЙ! Ничего не изменилось. С задержкой тарахтения нет, БЕЗ задержки ЕСТЬ!!!
Разница только в том, что теперь вместо 4 разрывов на диаграмме логана есть только 2! см кратинку
Нету. Пенопласт - луч-че. :) А ваще, чё ты хател? Сибирь - не хухры-мухры, хоть и идёт "хлобальное патепление" .. я бы сказал ползет "шаг вперед - два назад".. :) Шведы, к слову (а там таки теплей) строят с к-том теплоизоляции "от" 3-х, нормально 3.20 .. Считал когда-то, чтобы такое достичь надо иметь стену в красный кирпич - 25см плюсом положить сибит не хуже 160мм плюсом пенаплазд от 50мм, лучше 75мм и снаружи весь этот пирог законопатить облицовочным красным кирпичом от нашей "Стройкерамики" .. получишь 3.15-3.25 где-то так. И окна с тройным стеклопакетом в нагрузку.
Блин, как ты там жывёшь только, у меня в полу 150мм, а всеравно холодно. Думаю, на минвату есть ли смысл менять?
=======================
ПОЛНЫЙ ОФФТОП
=======================
Как как? В кухне в пик морозов на полу +11, на стене +22.
В комнатах 1-ого этажа холоднее, чем на 2-м, но нормально 22-24, холод по полу.
Но сам щит 200 + пена + вагонка. На полу тоже пена 50+фанера+ламинат, со стороны подпола какие-то маты минваты видел, даже не все отвалились еще. ;). Вообще основной холод - по углам пола. Это что еще - когда теща только померла - на кухне стенки было - слой вагонки и остекление на три стены - это "веранда" была! Любили это говно в дачах раньше делать! В нашем климате - "веранда", млять!
Но в холодный месяц - 1000 (и более) кубов газа сжигаю, котел аж шипит на максимуме!
Но Москва не такая континентальная, как твой Новосиб. У нас "холод-холод" - это ночная ниже 20. Такое случается максимум 1 неделю в зиму. Была зима 2006, когда -20 стояло месяц и пики утренние я, лично, видел -34!!!. Но за мои 49 лет - такая херня была 1 раз.
-----------------
не пугайтесь, что я так рано встал (в Мск - 7 утра). У меня коты окно на кухне открыли и я сверху усылышал возмущенный лай замерзающего щена. (вот взяли нового) А разбудить жену в 7 утра рискнет только суиицидник. Ща пойду обратно... только успокоюсь немного.
Но Москва не такая континентальная, как твой Новосиб. У нас "холод-холод" - это ночная ниже 20. Такое случается максимум 1 неделю в зиму. Была зима 2006, когда -20 стояло месяц и пики утренние я, лично, видел -34!!!. Но за мои 49 лет - такая херня была 1 раз.
А что касается темы, то благодаря совету Arhat109-2 уже ЕСТЬ положительные результаты!!!
Разбил свою подпрограмму Serial_Report () на две подпрограммы Serial_Report ()
/********************************************************************************************
void Serial_Report ()
//********************************************************************************************
{
while ( Serial.available() > 0) { // пока в буфере приема есть принятый байт, то
char c = Serial.read(); // считываем его в переменную "char c"
Serial.print(c); // и возвращаем запомненный код обратно в компьютер
if ( sofar < MAX_BUF-1 ){ // если счетчик принятых байтов меньше глубины программного буфера приема, то
buffer[sofar++] = c ; } // запоминаем принятый байт в программном буфере приема, и увеличиваем счетчик принятых байтов
if ( c == '\n' ){ // если принятого байта кода конца строки G-кода ('\n'), то
buffer[sofar] = 0 ; // в программном буфере приема запоминаем байт "00h", и
gCODE_RECEIVED = true ; // выставляем флаг "G-код пнригят"
} }
}
и Serial_Report_ ()
//********************************************************************************************
void Serial_Report_ ()
//********************************************************************************************
{
processCommand() ; // определяем тип принятого G-кода
if ( input_G_code == 0 || input_G_code == 1 ){ // если введен цепочный G-код, то
input_X = parsenumber('X',temp_Xa) ; // фиксируем введенную координату "оси X"
input_Y = parsenumber('Y',temp_Ya) ; // фиксируем введенную координату "оси Y"
if ( input_X == temp_Xa && input_Y == temp_Ya ){ // если введенные координаты соответствуют текущим координатам, то
ready(); } // посылаем запрос на введение следующего G-кода
else { START_Chain_Segment = true ; } } // выставлем флаг приема данных цепочки сегментов
else { START_Chain_Segment = false ; } // если введен НЕ цепочный G-код, то сбрасываем флаг приема данных цепочки сегментов
}
в лопе записал
//********************************************************************************************
void loop()
//********************************************************************************************
{
Serial_Report (); // принимаем G-код
if ( gCODE_RECEIVED == true){ // если принят G-код, то
Serial_Report_ (); } // определяем тип принятого G-кода
if ( START_Chain_Segment == true ){ // если введен цепочный G-код, то
STATUS_MODE_Segment = true ; // выставляем флаг совпадения режима сегмента
input_count_buf = 0; // сбрасываем счетчик входного буфера
set_MODE_Segment() ; // определяем параметры режима движения,
Calculation_Delta_Move() ; // определяем число щагов перемещения в очередном сегменте вводимой цепочки
Delta_Move = input_Delta_Move ; // определяем общее число щагов перемещения в цепочке
SAVE_input_data() ; // сохраняем расчитанные параметры для введенного сегмента
process_input_data(); // если введен первый сегмент цепочки, то запускаем перемещение каретки
START_Chain_Segment = false ; // сбрасываем флаг приема данных цепочки сегментов
} // посылаем запрос на введение следующего G-кода
else { }
}
в ISR(TIMER1_COMPA_vect) изменил условие if ( Delta_Move_Segment == count_a ) на if ( Delta_Move == 0 )
и теперь на отдельном прямолинейном перемещении, разбитым на сегменты, тарахтения НЕТ !!! ;)
Сейчас работаю над движением по замкнутому контуру. О результатах отпишусь позднее.
) А ваще, чё ты хател? Сибирь - не хухры-мухры, хоть и идёт "хлобальное патепление" .. я бы сказал ползет "шаг вперед - два назад".. :) Шведы, к слову (а там таки теплей) строят с к-том теплоизоляции "от" 3-х, нормально 3.20 .. Считал когда-то, чтобы такое достичь надо иметь стену в красный кирпич - 25см плюсом положить сибит не хуже 160мм плюсом пенаплазд от 50мм, лучше 75мм и снаружи весь этот пирог законопатить облицовочным красным кирпичом от нашей "Стройкерамики" .. получишь 3.15-3.25 где-то так. И окна с тройным стеклопакетом в нагрузку.
Для нашего региона (Кавминводы) по нормам стена из кирпича должна быть 1 метр )))
Если ты большой и взрослый, то должен помнить зиму 1978 года(-38), и зиму 1987 года(-32.4)!!! А в 2006 году (-30.8) зима была не сильно круче, чем зимы 1991 и 1997 годов (-29.6 и -28.8) Да и зима 2017 года тоже имела свои -29.9!
1. В 78-ом мне было 8 лет (19.11.1969). Сорри, я не знаю людей, которые помнят себя в 8 ;).
в 87-ом ползимы провел с аппендицитом осложненным. Но и молодость... все кажется ерундой.
...хм-м, 2017 и прошедшая - 2018, мне показались очень теплыми... 2017 - еще и почти бесснежной. Может и была пара холодных ночей, но я их не заметил. А 2006-ой помню очень хорощо! Я еще тогда работал, хрен его знает зачем? ;) и помню как машину утром с чайником кипяка заводил... еще в Москве, не надаче. Пик на градуснике был -37, так что Вики - что-то подвирает... ну или ее данные с термеметра на МГУ, например, а там теплее.
===================================
теперь про код - идешь правильной дорогой. Главное - что сам, а Архат или Евгений или Дайман или я - код за тебя не пишем. Это очень хорошо. Теперь попробуй убрать рекурсивный вызов СериалРепорт() из МувТуПозишн().
Иначе где-то, когда-то опять косяк всплывет. Ведь прямая и явная причина косяка так и не обнаружена. Ты "выпрямляешь" кривой код - косяк пропадает... но пока код не прозрачен в работе - косяк может проявиться снова.
------------------
Теперь про логику установки скорости в ISR():
тут должно быть все просто: если на данный момент, шагов до предполагаемой остановки больше, чем потребно на данной скорости, то скорость увеличиваем (то есть укорачиваем задержку на одну позицию), иначе - уменьшаем скорость. (увеличить скорость - взять задержку stepCount+1, уменьшить -1, соотв. )
Можно, для купирования возможных экстренных ситуаций, предусмотреть, что делать, если шагов до остановки МЕНЬШЕ потребного (вдруг ты введешь кнопки ручного управления в станок?) - - уменьшать скорость быстрее, чем на один шаг. Такого, по алгоритму, не должно происходить, но можно и обработать... так, для красоты. ;)
Поздравляю. Теперь ответьте себе на вопрос: что делает вызов process_input_data() внутри функции move_to_position()? В общем-то когда функция А() содержит внутри себя вызов функции В(), которая в процессе работы вызывает функцию А() снова .. называется рекурсия. Вот её Вас и просят убрать с самого момента публикации поста №46 .. не знали что это такое? Может оно там теперь лишнее? Команду, Вы все одно принимаете в самом loop() ..
1. В 78-ом мне было 8 лет (19.11.1969). Сорри, я не знаю людей, которые помнят себя в 8 ;).
А их можно легко определить!
Если человек утрердительно пишет
wdrakula пишет:
Но за мои 49 лет - такая херня была 1 раз.
то это значит, что он помнит все свои годы жизни!
А если человек пишет "Сколько себя помню - такая херня была 1 раз.", то это значит, что человек помнит не все годы своей жизни!
wdrakula пишет:
теперь про код - идешь правильной дорогой. Главное - что сам, а Архат или Евгений или Дайман или я - код за тебя не пишем. Это очень хорошо.
А Евгений или Дайман это кто?
wdrakula пишет:
Теперь попробуй убрать рекурсивный вызов СериалРепорт() из МувТуПозишн().
Иначе где-то, когда-то опять косяк всплывет. Ведь прямая и явная причина косяка так и не обнаружена. Ты "выпрямляешь" кривой код - косяк пропадает... но пока код не прозрачен в работе - косяк может проявиться снова.
------------------
Теперь про логику установки скорости в ISR():
тут должно быть все просто: если на данный момент, шагов до предполагаемой остановки больше, чем потребно на данной скорости, то скорость увеличиваем (то есть укорачиваем задержку на одну позицию), иначе - уменьшаем скорость. (увеличить скорость - взять задержку stepCount+1, уменьшить -1, соотв. )
Можно, для купирования возможных экстренных ситуаций, предусмотреть, что делать, если шагов до остановки МЕНЬШЕ потребного (вдруг ты введешь кнопки ручного управления в станок?) - - уменьшать скорость быстрее, чем на один шаг. Такого, по алгоритму, не должно происходить, но можно и обработать... так, для красоты. ;)
Мужики, я уже месяц балдею от вас и ваших советов! У меня такое впечатление, что я помолодел лет на 45, и снова учусь в техникуме! :)
Поздравляю. Теперь ответьте себе на вопрос: что делает вызов process_input_data() внутри функции move_to_position()? В общем-то когда функция А() содержит внутри себя вызов функции В(), которая в процессе работы вызывает функцию А() снова .. называется рекурсия. Вот её Вас и просят убрать с самого момента публикации поста №46 .. не знали что это такое? Может оно там теперь лишнее? Команду, Вы все одно принимаете в самом loop() ..
Спасибо!
Особенно за определение того что вы называете словомрекурсия! Сразу видна старая школа.
У меня есть брат, который младше меня на 5 лет. Когда он учился в младших классах и проходил геометрию, моя матушка попросила меня объяснить ему признаки подобия треугольников. По математике у меня была пятерка и я, включив умного и взрослого, стал объяснять брату что такое подобие траугольников. Когда я закончил свое обучение, и произнес конечную фразу "... cледовательно такие треугольники называются подобными!", мой брат громко заплакал и сказал - "Мне не нужно знать про подобие труегольников, мне нужно знать когда они КОНГРУЭНТНЫ!!!" Вот тут я и притух! Оказалось что их поколение уже училось по новой программе!
С тобой так общаются, потому что ты много говорил о себе, но код твой уровня ниже "техникума".
Хочешь, чтобы я или иной программист, написали за тебя, уже понятно что, - дуй в "Ищу" и предлагай лавэ.
Хочешь чтобы помогали советами - прекращай пиздить. Пока твой уровень (как програмиста МК) ниже плинтуса.
Дальше будем говорить после того как уберешь рекурсию. Мне просто надоело. Может Архат посодействует.
Прочитай лекцию Евгения о переменных, если дойдет - убери ненужные глобалы. Параметры в функции передавай, как положено. Имена переменным давай на нормальном английском, или транслитом, а не на "пиджине". Гонор твой - просто заебал!!!! Еще раз - по качеству кода - ты пока пустое место. Молчи и исполняй задания. Если не можешь исполнить, как ты (только через неделю!!!) сказал про "убрать сериал" - так сразу и пиши: "Я тупой в Си, что от меня хотят не понимаю".
Я, видит Б..г, очень долго игнорировал твой гонор, делая скидку на возраст. Все. Алес.
----------------------------------
Еще раз попробу достучаться: вот какой должен быть код.
1. читаем команду, парсим.
2. читаем следующую, парсим,
3. если можно "склеить" - склеиваем, возвращаемся к п.2.,
4. если больше не склеивается, подготавливает данные для моторов.
5. ждем окончания работы моторов от ранних стадий (до текущего п.1). и передаем моторам новые данные. (если позволит память, можно сделать очередь);
6. возврат к 1.
---
моторы кушают данные через прерывания, само собой, на РАЗНЫХ таймерах. Вообще - тут удобнее использовать СТМ32... но это уже вкусовщина. Мега - в принципе тянет.
С тобой так общаются, потому что ты много говорил о себе, но код твой уровня ниже "техникума".
Это не код твой уровня ниже "техникума", это просто старороссийский стиль программирования!
wdrakula пишет:
Хочешь, чтобы я или иной программист, написали за тебя, уже понятно что, - дуй в "Ищу" и предлагай лавэ.
Что я хочу, я написал в первом сообщении темы
Цитата:
Объясните пожалуйста
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
и в нем нет просьбы что-то за меня написать!
wdrakula пишет:
Хочешь чтобы помогали советами - прекращай пиздить. Пока твой уровень (как програмиста МК) ниже плинтуса.
Про мой уровень (как программиста МК) не возвражаю! Но я вроде сюда не на курсы по программированию МК пришел, чтобы проходить курсы молодого бойца. Со мной можно попроще! Вот Архат написал в теме всего два своих сообщения, и я его понял!!! И что интересно, ему для этого даже не пришлось посылать меня ни на лекции Евгения, ни в библиотеку за даташитом, ни в гугл! И даже рассказывать мне о тяготах своего бытия!
wdrakula пишет:
Прочитай лекцию Евгения о переменных, если дойдет - убери ненужные глобалы. Параметры в функции передавай, как положено. Имена переменным давай на нормальном английском, или транслитом, а не на "пиджине".
Так я же не англичанин, чтобы писать СВОИ переменные на английском языке! Да и не студент, чтобы параметры функций писать как учили на лекциях! Я знаю что микроконтролеру до лампочки как я пишу переменные! Да и ардуина не ругается на мое йоркширское произношение и сильный российский акцент!
wdrakula пишет:
Гонор твой - просто заебал!!!! Еще раз - по качеству кода - ты пока пустое место. Молчи и исполняй задания. Если не можешь исполнить, как ты (только через неделю!!!) сказал про "убрать сериал" - так сразу и пиши: "Я тупой в Си, что от меня хотят не понимаю".
Я, видит Б..г, очень долго игнорировал твой гонор, делая скидку на возраст. Все. Алес.
Зачем так нервничать?! Я же ничего и не от кого не требую, и уже давно написал "Хочешь и знаешь - отвечаешь! Не хочешь или НЕ знаешь - ничего и НЕ отвечаешь! Вот и все!!!"
wdrakula пишет:
----------------------------------
Еще раз попробу достучаться: вот какой должен быть код.
1. читаем команду, парсим.
2. читаем следующую, парсим,
3. если можно "склеить" - склеиваем, возвращаемся к п.2.,
4. если больше не склеивается, подготавливает данные для моторов.
5. ждем окончания работы моторов от ранних стадий (до текущего п.1). и передаем моторам новые данные. (если позволит память, можно сделать очередь);
6. возврат к 1.
---
моторы кушают данные через прерывания, само собой, на РАЗНЫХ таймерах. Вообще - тут удобнее использовать СТМ32... но это уже вкусовщина. Мега - в принципе тянет.
А я так и делаю! За исключением того, что использую ОДИН таймер, и не вижу необходимости использовать второй!!!
Если речь за код из №46, то там уже сказано - рекурсия. Ну и по стилю: сильно пахнет индусским ПХП-кодом .. попробуйте разделить мух от котлет: прием/передачу команд от исполнительного кода, должно "исчезнуть".
Сделайте так: в loop остается Serial_Report(), который продолжает заниматься контролем приема/передачи и формированием данных по пришедшей команде(цепочке). Но из него уберите проверку условия что надо что-то двигать - косвенный запуск process_input_data(), а вот её перенесите тоже в loop() после работы с командой. Все равно, пока принимаете команду - вы ничего не делаете, а как только пришла - сериал пуст. Возможно ничего и не изменится, но место задержки станет явным - прием/пересылка "вперед назад за лиловыми кроликами" - Вы каждый принятый байт отправляете обратно, а кроме того, ещё шлете в сериал .. это как правило "долго" для МК. Тем более работа через класс Ардуино.. там целая цепочка наследуется.
И ещё, кажется обратное проникновение тоже есть: из process_input_data() точно также уберите все отправки и работу с сериал, косвенные .. в loop() тоже. Исчезнет рекурсия.
Смысл такой: в loop() должно получится примерно так:
1. Если надо, то прием данных от компа;
2. Есть что исполнять - исполнение команды;
3. Надо что-то отправить - отправляем.
и далее по циклу, но не смешивая одно внутри другого.
Хотел объяснить по-человечески, но после "послушать дурачков" и отказа вникать в даташит к МК (систему прерываний которого сам же требовал вспомнить для поиска проблемы там, где ее нет), мотивируя тем, что "ардуино это не микроконтролер", считаю, что надо просто сливать воду.
Что же вы такие обидчивые?! Я разве где писал что отказываюсь вникать в даташит?! Просто в нем 435 страниц на английском языке, и я его еще не прочитал до конца. А что касается того что "ардуино это не микроконтролер", то это не я придумал! Я просто прочитал это на главной страничке данного сайта, отвечающей на вопрос "Что такое Ардуино?" и привел цитаты из нее.
Не совсем правильно понимаешь! Я как раз, с 1995 и по 2013 годы, отработал в тех сервисных центрах, которые давали консультации нежестоящим сервисным центрам, и без моего последнего слова мало кто мог, как ты выразился, "чихать" и "пукать"!
Тебе просто не повезло! Ты все время общался не с авторизованными сервисными центрами, а с рекомендованными сервисными центрами. В авторизованных сервисных центрах ВСЕГДА есть не только все необходимые сервис мануалы, но и ВСЕ приложения и дополнения к ним. Раньше вся эта документация поставлялась фирмами в виде бумажных журналов, потом в виде СD или DVD дисков, а сегодня простым интернетовским доступом на сервисную страничку фирмы.
1. Алегир! Я не "зря". Это нормальная реакция на "ссылку на занятость". Тебе никто не обязан помогать. ДЕЛО НЕ В ПРЕРЫВАНИЯХ - тебе 1000 раз сказали! Остальное - ты сам должен искать косяки в твоем коде. Тебе помогают, при случае, а ты требуешь чего-то странного: "почему задержка помогает?" - да я не знаю почему! - не должна помогать. Это непредсказуемое поведение ошибочного кода. Такие ошибки очень трудно ловить.
2. Пока я не взядся за код - первые мысли - это, для начала, убрать ввод из сериала, совсем убрать. Задай последовательность G-кода, а лучше сразу координат, просто в массиве. Будет очень легко заменить функции чтения из сериала на чтение из массива.
Таким образом мы отсечем "половину пустыни", то есть возможное влияние сторонних программ по передаче и чтению сериала.
-----------------
Про пустыню - мне стыдно напоминать, но это основа инженерных изысканий: как найти льва в пустыне: 1. делим пустыню пополам решеткой, ну и так далее. В конце лев оказывается в клетке. Мне, в мои годы, в МГУ, эту шутку еще преподавали.
-------------------
так вот, за время споров и пока я не в форме (чесно говоря я просто с утра до вечера на смеси водки+феназепам+валокордин) можно провести часть исследований:
1. избавиться от рекурсии!!!!!!! и еще 100 "!"!!!! (нет ни одной реентерабельной функции, рекурсия просто гадит память и ничего не может дать)
2. убрать чтение из сериала.
3. (я так понял - уже сделано?) останавливать счет таймера в бездействии.
-----------------------------
Про даташит:
Про Ардуино у тебя сложилось неверное представление. Возможно виноват сайт... не знаю.
Ардуино это среда программирования, содержащая некоторые стандартные библиотеки и набор предкомпиляционных действий.
С точки зрения железа - это ГОЛЫЙ контроллер. Поэтому тебя и отсылаю к даташиту на контроллер. Кроме контроллера в Меге2560 есть ТОЛЬКО USB-UART интерфейс и светодиод. Стабилизатор питания и кнопку РЕСЕТ мы считать не станем... ;).
Отличия в программировании есть - среда сама ищет пути к библиотекам и позволяет использовать некоторые функции без деклараторов (Лучше б они это не делали!!!). В остальном - это просто программирование контроллера, согласно даташиту на стандартных С и С++.
Особенностьи реализации avr-GCC смотрим на https://www.nongnu.org/avr-libc/user-manual/index.html .
Особенности контроллеров на сайте Атмела, на 2560 ссылку я давал. В IDE есть каталог с ядром: hardware/arduino/avr/cores/arduino
Там можно посмотреть все "гадости" которые с контроллером делает среда! ;) ;) ;). Там настройки таймеров, АЦП и прочие мелочи.
Тебе просто не повезло! Ты все время общался не с авторизованными сервисными центрами, а с рекомендованными сервисными центрами. В авторизованных сервисных центрах ВСЕГДА есть не только все необходимые сервис мануалы, но и ВСЕ приложения и дополнения к ним. Раньше вся эта документация поставлялась фирмами в виде бумажных журналов, потом в виде СD или DVD дисков, а сегодня простым интернетовским доступом на сервисную страничку фирмы.
Я в курсе, не надо меня лечить. Десятки PSDS-овских дисков до сих пор помню.
Если Ваше "последнее слово" было такими же, как и код, который суда вывалили, то я удивлен, как в сервисах умудряются вобще хоть что-то чинить, а не тупо меняют все блоками, как папуасы.
я удивлен, как в сервисах умудряются вобще хоть что-то чинить, а не тупо меняют все блоками, как папуасы.
Ради честности следует сказать, что в авторизованных СЦ, по кр. мере что касается ноутов, просто запрещено проводить ремонт агрегатов, даже если паяльная станция позволяет менять чипы BGA (например). Это политика вендора. Платы собрать и отправить вендору, новые - -ставить. Паять запрещено, только поагрегатная замена.
Мне было смешно.... я логику понимаю...но все равно смешно.
За корявость представленного кода извиняюсь. Я хоть и не индус, но тоже не являюсь носителем языка, с рождения владеюшим его нормами. У меня пока "как слышиться, так и пишется".
Спасибо за совет! Я тоже думал в этом направлении, но меня сбила с толку реакция кода на ввод в подпрограмму обработки прерывания строки с задержкой на 200 мкс.
1. Алегир! Я не "зря". Это нормальная реакция на "ссылку на занятость".
Вообше-то я отвечал на твое сообщение, и общался с тобой, а не с кем-то другим обсуждал трудности общения в сегодняшнем интернете.
А я об этом уже писал в своем сообщении с номером 86
Хочешь и знаешь - отвечаешь! Не хочешь или НЕ знаешь - ничего и НЕ отвечаешь!
Я ничего не требую, и свой код предпочитаю проверять сам, понимая что мои проблемы это только МОИ проблемы. Просто я тоже думал что введенная мной задержка не должна была радикально повлиять на поведение кода, а она взяза и выдала свою "загогулину"!
Таким образом мы отсечем "половину пустыни", то есть возможное влияние сторонних программ по передаче и чтению сериала.
Я не думаю, что это удачное предложение! Я все-таки хочу в лесу грибы и ягоды собирать, а не в песчанной постыне за тушканчиками и скорпионами наблюдать!
-----------------
Про пустыню - мне стыдно напоминать, но это основа инженерных изысканий: как найти льва в пустыне: 1. делим пустыню пополам решеткой, ну и так далее. В конце лев оказывается в клетке. Мне, в мои годы, в МГУ, эту шутку еще преподавали.
-------------------
Мне тоже. в мои годы учебы в МЭИ, преподаватель высшей математики говорил - "Вы вечерники, и я учу вас думать, а не умничать!", когда мы проходили тройные интегралы. И рассказал байку о том как Эдисон набирал в свою лабораторию специалистов.
Эдисон давал кандидату колбу от изобретенной им лампочки и просил измерить ее внутренний объем, разрешая пользоваться всем тем что кандидат увидит в лаборатории. Если кандидат брал в руки лист бумаги, карандаш, логарифмическую линейку и штангельциркуль, то Эдисон просил кандидата обосновать свой выбор нужных ему предметов и рассказать о стратегии вычислений. Когда кандидат начинал говорить о том что он сначала мысденно разобъет колбу на элементарные геометрические фигуры (шар, цилиндр, усеченный конус) штангельциркулем измерит их размеры, возьмет тройные интегралы каждой фигуры и логарифмической линейкой будет вычислять их объемы, Эдисон сразу говорил кандидату что он ему не подходит, и рекомендовывал кандидату искать работу в бухгалтерских конторах. На вопроос кандидата "Почему?" Эдисон отвечал "Я вижу что вы умеете вычислять, а мне нужен человек который умеет думать! Эту задачу можно решить быстрее и точнее" После чего Эдисон брал колбу лампочки, из рукомойника наливал в нее воды до краев и переливал воду из колбы в измерительную мензуру!
Про даташит:
Про Ардуино у тебя сложилось неверное представление. Возможно виноват сайт... не знаю.
Ардуино это среда программирования, содержащая некоторые стандартные библиотеки и набор предкомпиляционных действий.
С точки зрения железа - это ГОЛЫЙ контроллер. Поэтому тебя и отсылаю к даташиту на контроллер. Кроме контроллера в Меге2560 есть ТОЛЬКО USB-UART интерфейс и светодиод. Стабилизатор питания и кнопку РЕСЕТ мы считать не станем... ;).
Отличия в программировании есть - среда сама ищет пути к библиотекам и позволяет использовать некоторые функции без деклараторов (Лучше б они это не делали!!!). В остальном - это просто программирование контроллера, согласно даташиту на стандартных С и С++.
Особенностьи реализации avr-GCC смотрим на https://www.nongnu.org/avr-libc/user-manual/index.html .
Особенности контроллеров на сайте Атмела, на 2560 ссылку я давал. В IDE есть каталог с ядром: hardware/arduino/avr/cores/arduino
Там можно посмотреть все "гадости" которые с контроллером делает среда! ;) ;) ;). Там настройки таймеров, АЦП и прочие мелочи.
Правильно ли я понял, что если Ардуино с точки зрения железа - это ГОЛЫЙ контроллер. А я уже прочитал даташиты на PIC контроллеры и микроконтроллеры Renesas, то мне уже не надо читать даташит на микроконтроллеры Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V, и надо только узнать какие "гадости" с контроллером делает среда?
Я в курсе, не надо меня лечить. Десятки PSDS-овских дисков до сих пор помню.
Так тебя никто и не лечит! Тебе просто выразили сожаление!
Мое "последнее слово" не могло быть таким же, как и код, который я вывалил сюда! Там я был профессионалом, а тут я являюсь продвинутым дилетантом!
А удивляться тому, что в некоторых сервисах еще умудряются вобще хоть что-то чинить, не надо. Не все еще настоящие мастера ушли на пенсию!
Ради честности следует сказать, что в авторизованных СЦ, по кр. мере что касается ноутов, просто запрещено проводить ремонт агрегатов, даже если паяльная станция позволяет менять чипы BGA (например). Это политика вендора. Платы собрать и отправить вендору, новые - -ставить. Паять запрещено, только поагрегатная замена.
Мне было смешно.... я логику понимаю...но все равно смешно.
На платных ремонтах никто никому ничего не запрещает!!! А вот на гарантийных ремонтах глубина ремонта определяется категорией сервисного центра. Одним сервисным центрам действительно запрещается ремонтировать на компонентном уровне, другим разрешено. АСЦ при торговых фирмах, как правило нацелены на гарантийные ремонты, и не любят выполнять платные. Сервисные отношения вендора с производителем определяются индивидуальными договорами. Чем больше закупаешь и продаешь, тем проше отношения и с сервисными обязательствами производителя перед продавцом. Хочешь ремонтировать на блочном уровне и получать за это копейки - меняй! Только покупай вагонами, а не "газелькой", и не химич с платными ремонтами. (Это когда блоки с платных ремонтов вписываются в гарантийные отчеты, и фирма производитель возвращает сервисному центру их закупочную стоимость) Хочешь ремонтировать на компонентном уровне и зарабатывать на этом рубли, покупай рекомендованное оборудование и ремонтируй.
Когда, на заре становления сервисного центра, мой первый шеф спросил представителя фирмы - "Почему у вас такие низкие расценки на гарантийный ремонт?", сетуя на то что на таких расценках ничего не заработаешь, ему ответили - "Ваши доходы это наши расходы! И мы надеемся, что зарабытывать вы будете не на нас, а на тех возможностях, которые мы вам предоставляем нашей авторизацией!".
Правильно ли я понял, что если Ардуино с точки зрения железа - это ГОЛЫЙ контроллер.
Нет.
Вы совершенно верно цитировали, что есть Ардуино.
Вкратце: Ардуино - это концепция, которая за счет отказа от значительной части возможностей различных контроллеров позволяет унифицировать работу с ними.
Если мы делаем сравнительно простую конструкцию, оставшихся ограниченных возможностей, как правило, хватает для ее реализации. Но если нам нужна система посложнее, то той ограниченной функциональности, что обеспечивает концепция Ардуино, нам оказывается недостаточно. И единственный выход - отказаться от концепции Ардуино и начать адаптировать проект под конкретный контроллер. И в этом случае нам нужен дэйташит на этот контроллер вместо документации на Ардуино. Но это уже, строго говоря, не Ардуино, даже если мы используем контроллер, на котором написано Arduino, и программируем его с помощью Arduino IDE.
Правильно ли я понял, что если Ардуино с точки зрения железа - это ГОЛЫЙ контроллер. А я уже прочитал даташиты на PIC контроллеры и микроконтроллеры Renesas, то мне уже не надо читать даташит на микроконтроллеры Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V, и надо только узнать какие "гадости" с контроллером делает среда?
Нет конечно! Какое отношение PIC или Renesas имеют к AtMega2560? Тут, на нашем сайте, есть принципиальная схема Mega2560. Посмотри, там нет ничего, кроме контроллера, вот его мы и программируем, а Андриано - программирует Ардуино ;) - кто ж ему помешает ? ;) У нас пока свободная страна.
-----
И да, Андриано, как обычно, несет пафосную чушь ни о чем. Но может я не в силах оценить глубину его мысли? Тогда сорри ;).
Я так, для сведения, напишу для Андриано: ТС УЖЕ использует НЕ Ардуино, так как в Ардуино нет ISR() ;) ;) ;).
===================
Да, по делу:
Я уже понемногу слезаю с транквилизаторов... жизнь все-таки продолжается... так что давай искать ошибку.
1. Понимаешь, в непредсказуемом коде искать ошибку очень непросто. Я не предлагаю тебе отказываться от каких-то частей, но избавиться НА ВРЕМЯ от сериала - необходимо. Это не навсегда, потом вернем обязательно, но нужно найти чертов баг!!!
2. Самое первое - убери, плз, рекурсию... Я просто подожду версии кода без рекурсии, пока она есть, говорить о любом поведении программы - не имеет смысла, как о погоде в Занзибаре. Я понимаю, что она случайно получилась. И не гоню на "новичка"... Но код твой. Ты имеешь в голове некую концепцию - ты и изменяй код. Если стану править я - это будет мой код :).
3. Не совсем ясна твоя идея о работе с обоими двигателями одним таймером: а если по X равномерно вперед, а по Y - пила?
Поясни, если не трудно... это пока не касается кода, скорее вызывает замешательство.
Концептуально у него всегда только одна из двух осей работает.
А рекурсии - последствия передозировки ассемблером или иными тяжелыми наркотиками: переменные - глобалы,функции без параметров, вызов функции рассматривается как jmp, без оценки последствий такого приема.
Концептуально у него всегда только одна из двух осей работает.
Если под осями ты подразумеваешь работу двигателей, то концептуально у меня почти всегда (99.9%) работают ДВЕ оси. Я в своем проекте использую кинематику"AxiDraw", поэтому даже тогда когда перемешение происходит строго по оси "X" или по оси "Y", у меня работают два мотора! Один мотор работает только тогда, когда перемещение происходит под диагонали с улом 45 градумов.
А рекурсии - последствия передозировки ассемблером или иными тяжелыми наркотиками: переменные - глобалы,функции без параметров, вызов функции рассматривается как jmp, без оценки последствий такого приема.
Это не последствия передозировки ассемблером, а авторский почерк художника старой школы! Я, как-никак обучался в 70-х, и свои отношения с вычислительной техникой начинал с машинных кодов и ассемблера.
Вы совершенно верно цитировали, что есть Ардуино.
Вкратце: Ардуино - это концепция, которая за счет отказа от значительной части возможностей различных контроллеров позволяет унифицировать работу с ними.
Если мы делаем сравнительно простую конструкцию, оставшихся ограниченных возможностей, как правило, хватает для ее реализации. Но если нам нужна система посложнее, то той ограниченной функциональности, что обеспечивает концепция Ардуино, нам оказывается недостаточно. И единственный выход - отказаться от концепции Ардуино и начать адаптировать проект под конкретный контроллер. И в этом случае нам нужен дэйташит на этот контроллер вместо документации на Ардуино. Но это уже, строго говоря, не Ардуино, даже если мы используем контроллер, на котором написано Arduino, и программируем его с помощью Arduino IDE.
Правильно ли я понял ваш намек, что если человек делает систему посложнее мырга светодиодом, то ему не стоит задавать свои вопросы на форуме сайта arduino.ru?
===================
Да, по делу:
Я уже понемногу слезаю с транквилизаторов... жизнь все-таки продолжается... так что давай искать ошибку.
1. Понимаешь, в непредсказуемом коде искать ошибку очень непросто. Я не предлагаю тебе отказываться от каких-то частей, но избавиться НА ВРЕМЯ от сериала - необходимо. Это не навсегда, потом вернем обязательно, но нужно найти чертов баг!!!
Что ты подразумеваешь под словом "сериал"?
А если я буду править свой код под тебя, то это уже будет не мой проект, а твой, написанных мною под твоим руководством!
Поясни, если не трудно... это пока не касается кода, скорее вызывает замешательство.
Это обусловлено тем, что я использую кинематику AxiDraw (см https://habr.com/post/393535/ ) а в ней движение по вертикали или горизонтали обеспечивается не одним движком, а двумя. Работа одного движка производит только движение под диагонали, по углом 45 градусов.
Нет, не правильно.
То, что полностью лежит внутри концепции Ардуино, описано в документации. А форум - он для "около-Ардуиновских" тем. В том числе и для обмена опытом общения с конкретными контроллерами. Включая те, что официально Ардуино не поддерживаются (например, stm32duino).
А по поводу намека - он был на то, что никто даже не планировал размещать на сайте Ардуино всю документацию, которая может понадобиться для конкретного проекта, даже если в основе проекта лежит плата Ардуино.
Вы совершенно верно цитировали, что есть Ардуино.
Вкратце: Ардуино - это концепция, которая за счет отказа от значительной части возможностей различных контроллеров позволяет унифицировать работу с ними.
Если мы делаем сравнительно простую конструкцию, оставшихся ограниченных возможностей, как правило, хватает для ее реализации. Но если нам нужна система посложнее, то той ограниченной функциональности, что обеспечивает концепция Ардуино, нам оказывается недостаточно. И единственный выход - отказаться от концепции Ардуино и начать адаптировать проект под конкретный контроллер. И в этом случае нам нужен дэйташит на этот контроллер вместо документации на Ардуино. Но это уже, строго говоря, не Ардуино, даже если мы используем контроллер, на котором написано Arduino, и программируем его с помощью Arduino IDE.
Правильно ли я понял ваш намек, что если человек делает систему посложнее мырга светодиодом, то ему не стоит задавать свои вопросы на форуме сайта arduino.ru?
Ардуино - это не микроконтроллер, и даже не плата, сделанная на основе Atmel микроконтроллера когда-то давным-давно и даже не ИДЕ с его кривовастыми библотеками иподходом "скозной нумерации пинов", несмотря на то, что практически каждый пин заточен под исключительно свое применение!
Ардуино - это совокупность всего этого, имеющая наипервейшую цель .. ОБУЧЕНИЕ НОВИЧКОВ и .. ничего больше. ЕДИНСТВЕННУЮ.
Как только, Вы полезли в "даташит", как только Вы начали использовать макросы "io.h" (TCCRA, ISR) как-только Вы пытаетесь что-то "допаять" .. всё, Вы вышли на иной "уровень" .. и ссылаться на "Ардуино" - не верно. У вас есть некая "отладочная плата" (может и с маркировкой "Ардуино"), на которой есть некий микроконтроллер, и ЗАДАЧА, которая решается ОБЩИМИ средствами .. и "Ардуино" - тут не приделах. Так, по инерции..
И вот тут уже, для решения вашей задачи, да .. даташит, компилятор, io.h и все остальные "серьезные" вопросы. И уже не на этом сайте. :)
(* меня тоже долго удивляло, почему тут бесполезно задавать вопросы сложнее ногодрыга .. впрочем пробегитесь по моим темам .. там всё наглядно. *)
Нет, не правильно.
То, что полностью лежит внутри концепции Ардуино, описано в документации. А форум - он для "около-Ардуиновских" тем. В том числе и для обмена опытом общения с конкретными контроллерами. Включая те, что официально Ардуино не поддерживаются (например, stm32duino).
А по поводу намека - он был на то, что никто даже не планировал размещать на сайте Ардуино всю документацию, которая может понадобиться для конкретного проекта, даже если в основе проекта лежит плата Ардуино.
Что ты подразумеваешь под словом "сериал"?
Ввод через последовательный порт. Ты придуривашься? Не стоит.
А если я буду править свой код под тебя, то это уже будет не мой проект, а твой, написанных мною под твоим руководством!
Страдаешь от коммуникативной депривации? Я тебе говорю не как код переделывать, а как ошибку найти. Потом возвращай все, как желаешь. Ты понимаешь как искать ошибку или ее должен искать я? Я обещаю помочь найти ошибку, если ты не споришь. Я не ПЕРЕДЕЛЫВАЮ твой код, говорю, как его сократить и изменить не для его лучшей работа, а для изоляции ошибки.
Понимаешь ли ты, что факт влияния задержки в ISR() на работу кода - это и есть ДИАГНОСТИЧЕСКИЙ признак ошибки в коде? Вот эту ошибку мы и ищем. Пиши свой код - как хочешь. Он очень кривой, но это не мое дело. Я даже не лезу в саму логику - мне это не нужно, я говорю об изменениях, ВРЕМЕННЫХ ИЗМЕНЕНИЯХ, в целях локализации ошибки.
Или мы друг-друга не поняли?
На твой вопрос в первом посте: "почему влияет задержка?" - я отвечаю - "не знаю!". Это признак ошибки в коде. Я готов показать тебе последовательность действий, которые помогут ТЕБЕ САМОМУ найти эту ошибку. Я не стану ее искать сам. Если устраивает - выполни задания: убрать сериал и рекурсию и снова снять сигнал логаналайзером.
Данные на почту: мой ник на жмейле.
Это обусловлено тем, что я использую кинематику AxiDraw (см https://habr.com/post/393535/ ) а в ней движение по вертикали или горизонтали обеспечивается не одним движком, а двумя. Работа одного движка производит только движение под диагонали, по углом 45 градусов.
Ты не на мой вопрос отвечал. :) Я спросил: как ОДИН таймер должен обслуживать ДВА двигателя?
Это не касается ошибки, просто любопытство.
Да неужели дошло?!? Не верю! :)
Я надеялся на лучшее!
Впервые я сюда заглянул в 2013 году, когда узнал про ардуину. И первое мое впечатление было что это сайт для детей и людей, которые мало чего знают про элетронику и программирование микроконтроллеров, но хотят приобщится к этому. Я понял, что этот сайт, приобщая детей и людей к электронике, занимается хорошим делом, но это не то что мне нужно. Я запомил его в своих закладках, и пошел в гугл и даташиты.
Гуляя в гугле, я понял что в нашей стране ардуину любят только любознательные дети, и взрослые, не имеющие отношение ни к программированию, ни к электронике. Профессионалы ее либо явно ненавидят (обычно этим занимаются вчерашние новички, прочитавшие даташит на пару страниц больше чем ребенок или врослый-дилетант), либо относятся к ардуине (и ее поклонникам) свысока.
Видя такое дело, и столкнувшись со своей метаморфозой, я подумал что за пять лет у ардуины могли появится квалифицированные специалисты, и на форуме сайта ардуины могли произойти серьезные изменения. Заглянув на форум, я увидел что тут люди стали даже деньги на этом зарабатывать! Но оказалось, что тех кто тут что-то зарабатывает почти нет, и они тут обычно не тусуются, а те кто тусуются, они ничего не зарабатывают, а только хотят зарабатывать, и заходят на форум чтобы стайкой почмурить заказчиков, и поглумится над новичками, советуя им начать с похода в гугл и чтения даташита.
Заглянув на форум, я увидел что тут люди стали даже деньги на этом зарабатывать! Но оказалось, что тех кто тут что-то зарабатывает почти нет, и они тут обычно не тусуются, а те кто тусуются, они ничего не зарабатывают,
Да, ты прав - заказов с этого сайта лично у меня - единицы. В большинстве случаев потому, что - либо потенциальный проект неинтересен по некоторым причинам, либо потому, что после первого общения заказчик оказывается просто "мимо проходил, поинтересовался". Плюс - ещё потому, что за доширак и без предоплаты не работаю.
С той же амперки - заказов сильно больше, не сказать, что прям на них можно безбедно жить, но вполне себе доход для поддержания штанов.
Что ты подразумеваешь под словом "сериал"?
Ввод через последовательный порт. Ты придуривашься? Не стоит.
Я не придуриваюсь, а уточняю, чтобы не было недопонимания!
Последовательный порт я убрать не могу! Так как обработка заранее заданного массива данных и обработка данных поступающих через последовательный прорт это две разные техничекские технические задачи!!!
А если я буду править свой код под тебя, то это уже будет не мой проект, а твой, написанных мною под твоим руководством!
Страдаешь от коммуникативной депривации? Я тебе говорю не как код переделывать, а как ошибку найти. Потом возвращай все, как желаешь. Ты понимаешь как искать ошибку или ее должен искать я? Я обещаю помочь найти ошибку, если ты не споришь. Я не ПЕРЕДЕЛЫВАЮ твой код, говорю, как его сократить и изменить не для его лучшей работа, а для изоляции ошибки.
Понимаешь ли ты, что факт влияния задержки в ISR() на работу кода - это и есть ДИАГНОСТИЧЕСКИЙ признак ошибки в коде? Вот эту ошибку мы и ищем. Пиши свой код - как хочешь. Он очень кривой, но это не мое дело. Я даже не лезу в саму логику - мне это не нужно, я говорю об изменениях, ВРЕМЕННЫХ ИЗМЕНЕНИЯХ, в целях локализации ошибки.
Или мы друг-друга не поняли?
Я действительно тебя не понимаю, когда ты просто говоришь сократи свой код, а потом начинаешь спрашивать зачем у тебя один таймер работает на два мотора!
Вот Arhat109-2 я сразу понял, когда он написал в своем сообщении с номером 101
Сделайте так: в loop остается Serial_Report(), который продолжает заниматься контролем приема/передачи и формированием данных по пришедшей команде(цепочке). Но из него уберите проверку условия что надо что-то двигать - косвенный запуск process_input_data(), а вот её перенесите тоже в loop() после работы с командой. Все равно, пока принимаете команду - вы ничего не делаете, а как только пришла - сериал пуст. Возможно ничего и не изменится, но место задержки станет явным - прием/пересылка "вперед назад за лиловыми кроликами" - Вы каждый принятый байт отправляете обратно, а кроме того, ещё шлете в сериал .. это как правило "долго" для МК. Тем более работа через класс Ардуино.. там целая цепочка наследуется.
И ещё, кажется обратное проникновение тоже есть: из process_input_data() точно также уберите все отправки и работу с сериал, косвенные .. в loop() тоже. Исчезнет рекурсия.
Смысл такой: в loop() должно получится примерно так:
1. Если надо, то прием данных от компа;
2. Есть что исполнять - исполнение команды;
3. Надо что-то отправить - отправляем.
и далее по циклу, но не смешивая одно внутри другого.
Данные на почту: мой ник на жмейле.
Мне твой подход напомнил байку, которую я услышал от преподавателя физики, когда он объяснял студентам чем отличаются подходы физика и математика к решению одной и той же задачи.
Физику и математику ставаят одну и ту же задачу - "Вы были на рыбалке. У вас есть пустое ведро, река и горящий костер. Вы возвращаетесь домой, и вам надо потушить костер. Ваши действия?"
физик и математик сказали что надо взять ведро, набрать из реки воды и вылить воду на костер.
Тосле этого им ставаят ту же задачу, но с несколько измененными условиями - "Вы были на рыбалке. У вас есть ведро с водой, река и горящий костер. Вы возвращаетесь домой, и вам надо потушить костер. Ваши действия?"
Физик отвечает что надо взять ведро с водой и вылить воду на костер.
Математик отвечает что надо подумать! И начинает думать - если нам надо потушить костер, то нам надо залить его водой. Воду мы может набрать из реки, но ведро занято! А если ведро занято, то мы не сможем потушить костер. Если мы будем использовать уже налитую воду в ведре, то мы не сможем использовать воду в реке, а она нам задана по условию задачи! Получается какая-то фигня, и тут явно есть ошибка в исходных данных. Поняв это он говорит экзаменатору что задачка не решаема, так как в ней есть избыточные данные, которые явно мешают решению задачи! Экзаменатор говорит - а вы поробуйте оптимизировать исходные данные. Математик - Ну если можно оптимизировать исходные данные, то надо просто вылить воду из ведра, и тогда решение задачки сведется к решению предыдущей!
Ты не на мой вопрос отвечал. :) Я спросил: как ОДИН таймер должен обслуживать ДВА двигателя?
Это не касается ошибки, просто любопытство.
На горизонтальных и вертикальных перемещениях два движка вращаются с одинаковым скоростями, и им не нужен еще один таймер!
Чего ж ты мозги детям и непрофессионалам-то канифолишь? Сходил бы на форум профессионалов - чего зря время терять. Давно бы уж своей гениальной прошивкой крутил моторы - профи же тебе сразу подсказали, какие две строчки местами поменять чтобы дырок в степе не было.
Чего ж ты мозги детям и непрофессионалам-то канифолишь? Сходил бы на форум профессионалов - чего зря время терять. Давно бы уж своей гениальной прошивкой крутил моторы - профи же тебе сразу подсказали, какие две строчки местами поменять чтобы дырок в степе не было.
Так меня попросили отметится в серьезных разделах форума, и не мешаться в разделе отвлеченных тем и поиска исполнителей! Вот я и решил пообщаться с серьезными людьми на серьезные темы. Оказалось что их тут немного, но они есть!
Прости, но мы топчемся на месте.
Я же не говорю - убрать ввод совсем. Я прошу проверить, КАК ВВОД влияет. Если "стук" пропадет", то ясно, что нужно оптимизировать ввод, если не пропадет, то нужно оптимизировать что-то другое.
Ты просто споришь на пустом месте, зачем? Ведь давно бы все нашли. Да и так давно ясно, что дело в рекурсивном вызове Serial_Report() в 296 строке. Но нужно нормальное поддтверждение. Таким подтверждением будет пропадание "стука" при отключении ввода из сериал-порта.
Получив это подтверждение - станем двигаться дальше. Уже сказать как и куда? Считыванием и интерпретацией блока кода заранее. Памяти в Меге, слава Б..гу, достаточно. Блин! Ты правда хочешь, чтобы за деда с седыми мудями, другой дед, с такими же мудями ;) , код писал? Если нет, то просто сделай, как я говорю, ДЛЯ ПРОВЕРКИ ДИАГНОЗА, а потом пиши, как угодно, хоть со всеми переменными в глобале, только без рекурсии, плз. ОК? ;)
А рекурсию убери, она у тебя всю память съест и переменные перемешает. Да хоть как Архат тебе написал переделай, но без рекурсии.
Про моторы понял - в твоем станке не бывает перемещений с разными скоростями, ОК.
Прости, но мы топчемся на месте.
Мы топчемся на месте потому, что один дед с седыми мудями, говорит другому деду с седыми мудями - "Сделай так как я тебя прошу!", и не хочет написать трех строчек кода КАК и ГДЕ ему надо изменить код, чтобы проверить его задумку! А другой дед с седыми мудями, видя свой корявый код и не видя нужных трех строчек кода, не понимает КАК и КУДА надо внести изменения, что бы не убирать ввод совсем, и проверить пропадет стук после этого или нет! Чтобы получив подтверждение мсыли первого деда - двигаться дальше.
Про моторы понял - в твоем станке не бывает перемещений с разными скоростями, ОК.
В моем "станке" все бывает, и перемешение с разными соростями, и перемещения в разных направлениях, и перемещение по дуге. Просто ты просил сделать маленькую программу, вот я и убрал из нее пару-тройку килобайт прошивки.
Чтобы получив подтверждение мсыли первого деда - двигаться дальше.
Ладно. Повеселил. Попробуем вместе что-то решить. Не давлю больше. У меня сердце не ахти - сегодня все, а завтра что-нить придумаю.
=================
Чтобы не собирать обо мне информацию, но представлять меня и что и когда я могу:
рожден 19.11.1969, Москва, школа-матшкола-МехМат МГУ, кафедра мат.логики
Женат, сын, внучка.
150+ кг, диабет 2, сердце (ИБС).
не работаю вообще и не зарабатываю, рантье.
Живу круглый на сталинской даче в Раменском (Кратово).
Много травм - от спорта, и лощадки и мотоцикл... До сих пор упертый байкер, до самого снега.
----------------------------
Я не сильно здоровый человек - рано ложусь и поздно встаю... с 6 вечера - уже ужин и самогон ;).
Я про себя пояснил, чтобы было понятно, чего от меня можно ждать.
Чтобы не собирать обо мне информацию, но представлять меня и что и когда я могу:
рожден 19.11.1969, Москва, школа-матшкола-МехМат МГУ, кафедра мат.логики
Женат, сын, внучка.
150+ кг, диабет 2, сердце (ИБС).
не работаю вообще и не зарабатываю, рантье.
Живу круглый на сталинской даче в Раменском (Кратово).
Много травм - от спорта, и лощадки и мотоцикл... До сих пор упертый байкер, до самого снега.
----------------------------
Я не сильно здоровый человек - рано ложусь и поздно встаю... с 6 вечера - уже ужин и самогон ;).
Я про себя пояснил, чтобы было понятно, чего от меня можно ждать.
Ну если чтобы было понятно, чего от меня можно ждать, то мне так в жизни не повезло!
Я в 1976 году только окончил техникум (почти с красным дипломом) и поступил в МЭИ на вечерний факультет Автоматики и вычислительной техники. После окончания техникума по распределению был направлен в ГосНИИЭРАТ граждданской авиации, где впервые увидел ЭВМ МИР-2 ( см http://ru.pc-history.com/evm-mir-2.html ), которую мне пришлось обслуживать (выявлять отказы ТЭЗов и ремонтировать их)
C 12.11.1976 по 12.11.1978 служил в армии в Приморском крае. Где служил на должности прапорщика и все два года занимался ремонтом телефонной и телеграфной аппаратуры ЗАС со всей тамошней армии, получая за это все 24 месяца службы по 20 р 80 коп ежемесячно. (те кто служил знают что это такое)
После дембеля, С 1979 по 1981 годы, работал в пуско-наладочном управлении с названием "СпецЭВМ комплекс", и запускал по всей России автоматизированные рабочие места проектировщиков (АРМ-П и АРМ-М) на баэе малых ЭВМ "М400" и "СМ3" ( см рисунок 10 на http://www.computer-museum.ru/articles/sm-evm/1026/ )
До 1985 года (пока учился в МЭИ) работал на эксплуатации ЕС ЭВМ
C 1985 по 1995 годы работал в одном из московских НИИ, где c 1987 года, будучи уже ведущим инженером, занимался разработкой электронных средств контроля и тестирования для специальных вычислительных машин.
Ну а о том, что было дальше я уже тут писал.
Могу только добавить, что имею вес около 90 кг и рост выше среднего (186 см). Спортом никогда не занимался, но имею грамоты от различных учебных заведений за победу в соревнованиях по бегу на средние дистанции, по прыжкам в высоту и по плаванию. Обладаю вокальными данными, но после 50 лет почти не пою.
Я писал про себя, не для того, чтобы "оголиться перед партией" ;), а для того, чтобы было понятно, что я мало часов в день могу посвятить чужим проблеммам, и почему это так. Чтобы ты снова не винил меня в отговорках.
---------------------------
Ладно. Я кажется нашел где задержка у тебя. Но править ее... Не обижайся... я правда долго думал, как исправить, не ломая твой код. Не придумал.
Вот сама причина: (будет многословно)
Ты планировал "склеивать" два совместимых по направлению G-кода, так? И читать следующий код, пока движется каретка на прерываниях, я прав?
Цепочка такая:
Serial_Report() -> SET_input_data() -> process_input_data() -> moveToPosition() -> Serial_Report()
функция ready() перед чтением вызывается, я проверил. Остается одно - комп не отдает следующий код так быстро. Если ты добавляешь 200 мкc * 10*100 шагов = 200 мс, то комп успевает отдать, а ардуинка обработать следующий G-код.
Проверь, если не трудно:
начало Serial_report() заменяешь на
в сетапе комментируешь Serial.begin и в ready() Serial.print - тоже комментируешь.
добавляешь ДВЕ глобальные переменные:
Я писал про себя, не для того, чтобы "оголиться перед партией" ;), а для того, чтобы было понятно, что я мало часов в день могу посвятить чужим проблеммам, и почему это так. Чтобы ты снова не винил меня в отговорках.
Я понял, что ты хотел написать о том что занятый и не совсем здоровый человек. Меня просто сбили с толку твои слова про школу-матшколу-МехМат МГУ, кафедру мат.логики и круглогодичную жизнь на сталинской даче в Раменском (Кратово).
Ладно. Я кажется нашел где задержка у тебя. Но править ее... Не обижайся... я правда долго думал, как исправить, не ломая твой код. Не придумал.
Вот сама причина: (будет многословно)
Ты планировал "склеивать" два совместимых по направлению G-кода, так? И читать следующий код, пока движется каретка на прерываниях, я прав?
Да! Я склеиваю до 40-ка совместимых по направлению G-кодов.
Цепочка такая:
Serial_Report() -> SET_input_data() -> process_input_data() -> moveToPosition() -> Serial_Report()
функция ready() перед чтением вызывается, я проверил. Остается одно - комп не отдает следующий код так быстро. Если ты добавляешь 200 мкc * 10*100 шагов = 200 мс, то комп успевает отдать, а ардуинка обработать следующий G-код.
Комп все отдает как надо. В своем сообшении под номером 55 я дал две картинки с логического анализатора, и на нижней картинке четко видно что комп успевает передать все G-коды склеиваемых сегментов почти за первые 50 милисекунд движения по первому сегменту, а разрывы в склейках появляются на 150 мс, на 250 мс, на 350 мс и на 450 мс! А что касается добавления задержки в 200 мкс, то она свое воздействие оказывает всего ОДИН раз за все шаги сегмета, а не по формуле "200 мкc * 10*100 шагов = 200 мс"!!!
Проверь, если не трудно:
начало Serial_report() заменяешь на
в сетапе комментируешь Serial.begin и в ready() Serial.print - тоже комментируешь.
добавляешь ДВЕ глобальные переменные:
Обязательно проверю! Но только немного попозже. Я сейчас реализовываю рекомендацию от Arhat109-2, которую он дал в своем сообщении под номером 101.
Обязательно проверю! Но только немного попозже. Я сейчас реализовываю рекомендацию от Arhat109-2, которую он дал в своем сообщении под номером 101.
Это правильно! Если ты, при этом, избавишься от рекурсии - возможно все исправится само.
Да, ты прав, 200 мкс работают 1 раз. тогда влияния вообще никакого не должно быть, только разная работа оптимизатора при компиляции. Посмотрим. Даже любопытно становится.
Я понял, что ты хотел написать о том что занятый и не совсем здоровый человек. Меня просто сбили с толку твои слова про школу-матшколу-МехМат МГУ, кафедру мат.логики и круглогодичную жизнь на сталинской даче в Раменском (Кратово).
Ну ведь не на Рублевке же!!! Это старые участки, я живу в щитовом летнем доме (который я покрыл вагонкой, пенопластом и матюгами ;) ), который построен в 1934 году... со всемы щелями и размерарами... так что "повезло", это не совсем верный термин, ИМХО.
Пинаплазд какой толщины?
Выполняю свое обещание
Обязательно проверю! Но только немного попозже.
вставил в код
и в Serial_Report ()
закоментировал в сетапе
Результат ОТРИЦАТЕЛЬНЫЙ! Ничего не изменилось. С задержкой тарахтения нет, БЕЗ задержки ЕСТЬ!!!
Разница только в том, что теперь вместо 4 разрывов на диаграмме логана есть только 2! см кратинку
Пинаплазд какой толщины?
местами 100, местами 50
Результат ОТРИЦАТЕЛЬНЫЙ! Ничего не изменилось. С задержкой тарахтения нет, БЕЗ задержки ЕСТЬ!!!
Круто! Нада напиццо! (ДетСимен, превед!)
Бум ждать версии по заветам Архата... Если сам разберешься - попробуй отключить оптимизацию при компиляции.
Это можно опциями или #PRAGMA задавать... завтра, когда буду трезвым - напишу, если сам не разберешься.
местами 100, местами 50
Блин, как ты там жывёшь только, у меня в полу 150мм, а всеравно холодно. Думаю, на минвату есть ли смысл менять?
Нету. Пенопласт - луч-че. :) А ваще, чё ты хател? Сибирь - не хухры-мухры, хоть и идёт "хлобальное патепление" .. я бы сказал ползет "шаг вперед - два назад".. :) Шведы, к слову (а там таки теплей) строят с к-том теплоизоляции "от" 3-х, нормально 3.20 .. Считал когда-то, чтобы такое достичь надо иметь стену в красный кирпич - 25см плюсом положить сибит не хуже 160мм плюсом пенаплазд от 50мм, лучше 75мм и снаружи весь этот пирог законопатить облицовочным красным кирпичом от нашей "Стройкерамики" .. получишь 3.15-3.25 где-то так. И окна с тройным стеклопакетом в нагрузку.
Блин, как ты там жывёшь только, у меня в полу 150мм, а всеравно холодно. Думаю, на минвату есть ли смысл менять?
У меня каркасник на сваях, в полу и стенах 200 (вата матами). Босиком иногда бывает прохладненько, но валенки не нужны.
местами 100, местами 50
Блин, как ты там жывёшь только, у меня в полу 150мм, а всеравно холодно. Думаю, на минвату есть ли смысл менять?
=======================
ПОЛНЫЙ ОФФТОП
=======================
Как как? В кухне в пик морозов на полу +11, на стене +22.
В комнатах 1-ого этажа холоднее, чем на 2-м, но нормально 22-24, холод по полу.
Но сам щит 200 + пена + вагонка. На полу тоже пена 50+фанера+ламинат, со стороны подпола какие-то маты минваты видел, даже не все отвалились еще. ;). Вообще основной холод - по углам пола. Это что еще - когда теща только померла - на кухне стенки было - слой вагонки и остекление на три стены - это "веранда" была! Любили это говно в дачах раньше делать! В нашем климате - "веранда", млять!
Но в холодный месяц - 1000 (и более) кубов газа сжигаю, котел аж шипит на максимуме!
Но Москва не такая континентальная, как твой Новосиб. У нас "холод-холод" - это ночная ниже 20. Такое случается максимум 1 неделю в зиму. Была зима 2006, когда -20 стояло месяц и пики утренние я, лично, видел -34!!!. Но за мои 49 лет - такая херня была 1 раз.
-----------------
не пугайтесь, что я так рано встал (в Мск - 7 утра). У меня коты окно на кухне открыли и я сверху усылышал возмущенный лай замерзающего щена. (вот взяли нового) А разбудить жену в 7 утра рискнет только суиицидник. Ща пойду обратно... только успокоюсь немного.
!!!! АХТУНГ!! ЖОСКИЙ ОФФТОП !!!!!!!!!!!!!!!!!!!!!!
У меня каркасник на сваях, в полу и стенах 200 (вата матами). Босиком иногда бывает прохладненько, но валенки не нужны.
А моей аццкой сотоне после -35С - нужны. Значить, нада забирку делать вкруг и утеплять дополнительно, а то не поездиишь в баню в морозы.
Пичальбида. :(
Сначала про ОФФТОП
Но Москва не такая континентальная, как твой Новосиб. У нас "холод-холод" - это ночная ниже 20. Такое случается максимум 1 неделю в зиму. Была зима 2006, когда -20 стояло месяц и пики утренние я, лично, видел -34!!!. Но за мои 49 лет - такая херня была 1 раз.
Если ты большой и взрослый, то должен помнить зиму 1978 года(-38), и зиму 1987 года(-32.4)!!! А в 2006 году (-30.8) зима была не сильно круче, чем зимы 1991 и 1997 годов (-29.6 и -28.8) Да и зима 2017 года тоже имела свои -29.9! (см https://ru.wikipedia.org/wiki/Климат_Москвы и http://www.aif.ru/dontknows/infographics/samye_holodnye_zimy_v_moskve_za_100_let_infografika )
А что касается темы, то благодаря совету Arhat109-2 уже ЕСТЬ положительные результаты!!!
Разбил свою подпрограмму Serial_Report () на две подпрограммы Serial_Report ()
и Serial_Report_ ()
в лопе записал
в ISR(TIMER1_COMPA_vect) изменил условие if ( Delta_Move_Segment == count_a ) на if ( Delta_Move == 0 )
и теперь на отдельном прямолинейном перемещении, разбитым на сегменты, тарахтения НЕТ !!! ;)
Сейчас работаю над движением по замкнутому контуру. О результатах отпишусь позднее.
Нету. Пенопласт - луч-че. :
Для нашего региона (Кавминводы) по нормам стена из кирпича должна быть 1 метр )))
Сначала про ОФФТОП
Если ты большой и взрослый, то должен помнить зиму 1978 года(-38), и зиму 1987 года(-32.4)!!! А в 2006 году (-30.8) зима была не сильно круче, чем зимы 1991 и 1997 годов (-29.6 и -28.8) Да и зима 2017 года тоже имела свои -29.9!
1. В 78-ом мне было 8 лет (19.11.1969). Сорри, я не знаю людей, которые помнят себя в 8 ;).
в 87-ом ползимы провел с аппендицитом осложненным. Но и молодость... все кажется ерундой.
...хм-м, 2017 и прошедшая - 2018, мне показались очень теплыми... 2017 - еще и почти бесснежной. Может и была пара холодных ночей, но я их не заметил. А 2006-ой помню очень хорощо! Я еще тогда работал, хрен его знает зачем? ;) и помню как машину утром с чайником кипяка заводил... еще в Москве, не надаче. Пик на градуснике был -37, так что Вики - что-то подвирает... ну или ее данные с термеметра на МГУ, например, а там теплее.
===================================
теперь про код - идешь правильной дорогой. Главное - что сам, а Архат или Евгений или Дайман или я - код за тебя не пишем. Это очень хорошо. Теперь попробуй убрать рекурсивный вызов СериалРепорт() из МувТуПозишн().
Иначе где-то, когда-то опять косяк всплывет. Ведь прямая и явная причина косяка так и не обнаружена. Ты "выпрямляешь" кривой код - косяк пропадает... но пока код не прозрачен в работе - косяк может проявиться снова.
------------------
Теперь про логику установки скорости в ISR():
тут должно быть все просто: если на данный момент, шагов до предполагаемой остановки больше, чем потребно на данной скорости, то скорость увеличиваем (то есть укорачиваем задержку на одну позицию), иначе - уменьшаем скорость. (увеличить скорость - взять задержку stepCount+1, уменьшить -1, соотв. )
Можно, для купирования возможных экстренных ситуаций, предусмотреть, что делать, если шагов до остановки МЕНЬШЕ потребного (вдруг ты введешь кнопки ручного управления в станок?) - - уменьшать скорость быстрее, чем на один шаг. Такого, по алгоритму, не должно происходить, но можно и обработать... так, для красоты. ;)
Поздравляю. Теперь ответьте себе на вопрос: что делает вызов process_input_data() внутри функции move_to_position()? В общем-то когда функция А() содержит внутри себя вызов функции В(), которая в процессе работы вызывает функцию А() снова .. называется рекурсия. Вот её Вас и просят убрать с самого момента публикации поста №46 .. не знали что это такое? Может оно там теперь лишнее? Команду, Вы все одно принимаете в самом loop() ..
1. В 78-ом мне было 8 лет (19.11.1969). Сорри, я не знаю людей, которые помнят себя в 8 ;).
А их можно легко определить!
Если человек утрердительно пишет
Но за мои 49 лет - такая херня была 1 раз.
то это значит, что он помнит все свои годы жизни!
А если человек пишет "Сколько себя помню - такая херня была 1 раз.", то это значит, что человек помнит не все годы своей жизни!
А Евгений или Дайман это кто?
Иначе где-то, когда-то опять косяк всплывет. Ведь прямая и явная причина косяка так и не обнаружена. Ты "выпрямляешь" кривой код - косяк пропадает... но пока код не прозрачен в работе - косяк может проявиться снова.
------------------
Теперь про логику установки скорости в ISR():
тут должно быть все просто: если на данный момент, шагов до предполагаемой остановки больше, чем потребно на данной скорости, то скорость увеличиваем (то есть укорачиваем задержку на одну позицию), иначе - уменьшаем скорость. (увеличить скорость - взять задержку stepCount+1, уменьшить -1, соотв. )
Можно, для купирования возможных экстренных ситуаций, предусмотреть, что делать, если шагов до остановки МЕНЬШЕ потребного (вдруг ты введешь кнопки ручного управления в станок?) - - уменьшать скорость быстрее, чем на один шаг. Такого, по алгоритму, не должно происходить, но можно и обработать... так, для красоты. ;)
Мужики, я уже месяц балдею от вас и ваших советов! У меня такое впечатление, что я помолодел лет на 45, и снова учусь в техникуме! :)
Поздравляю. Теперь ответьте себе на вопрос: что делает вызов process_input_data() внутри функции move_to_position()? В общем-то когда функция А() содержит внутри себя вызов функции В(), которая в процессе работы вызывает функцию А() снова .. называется рекурсия. Вот её Вас и просят убрать с самого момента публикации поста №46 .. не знали что это такое? Может оно там теперь лишнее? Команду, Вы все одно принимаете в самом loop() ..
Спасибо!
Особенно за определение того что вы называете словом рекурсия! Сразу видна старая школа.
У меня есть брат, который младше меня на 5 лет. Когда он учился в младших классах и проходил геометрию, моя матушка попросила меня объяснить ему признаки подобия треугольников. По математике у меня была пятерка и я, включив умного и взрослого, стал объяснять брату что такое подобие траугольников. Когда я закончил свое обучение, и произнес конечную фразу "... cледовательно такие треугольники называются подобными!", мой брат громко заплакал и сказал - "Мне не нужно знать про подобие труегольников, мне нужно знать когда они КОНГРУЭНТНЫ!!!" Вот тут я и притух! Оказалось что их поколение уже училось по новой программе!
С тобой так общаются, потому что ты много говорил о себе, но код твой уровня ниже "техникума".
Хочешь, чтобы я или иной программист, написали за тебя, уже понятно что, - дуй в "Ищу" и предлагай лавэ.
Хочешь чтобы помогали советами - прекращай пиздить. Пока твой уровень (как програмиста МК) ниже плинтуса.
Дальше будем говорить после того как уберешь рекурсию. Мне просто надоело. Может Архат посодействует.
Прочитай лекцию Евгения о переменных, если дойдет - убери ненужные глобалы. Параметры в функции передавай, как положено. Имена переменным давай на нормальном английском, или транслитом, а не на "пиджине". Гонор твой - просто заебал!!!! Еще раз - по качеству кода - ты пока пустое место. Молчи и исполняй задания. Если не можешь исполнить, как ты (только через неделю!!!) сказал про "убрать сериал" - так сразу и пиши: "Я тупой в Си, что от меня хотят не понимаю".
Я, видит Б..г, очень долго игнорировал твой гонор, делая скидку на возраст. Все. Алес.
----------------------------------
Еще раз попробу достучаться: вот какой должен быть код.
1. читаем команду, парсим.
2. читаем следующую, парсим,
3. если можно "склеить" - склеиваем, возвращаемся к п.2.,
4. если больше не склеивается, подготавливает данные для моторов.
5. ждем окончания работы моторов от ранних стадий (до текущего п.1). и передаем моторам новые данные. (если позволит память, можно сделать очередь);
6. возврат к 1.
---
моторы кушают данные через прерывания, само собой, на РАЗНЫХ таймерах. Вообще - тут удобнее использовать СТМ32... но это уже вкусовщина. Мега - в принципе тянет.
С тобой так общаются, потому что ты много говорил о себе, но код твой уровня ниже "техникума".
Это не код твой уровня ниже "техникума", это просто старороссийский стиль программирования!
Хочешь, чтобы я или иной программист, написали за тебя, уже понятно что, - дуй в "Ищу" и предлагай лавэ.
Что я хочу, я написал в первом сообщении темы
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
и в нем нет просьбы что-то за меня написать!
Про мой уровень (как программиста МК) не возвражаю! Но я вроде сюда не на курсы по программированию МК пришел, чтобы проходить курсы молодого бойца. Со мной можно попроще! Вот Архат написал в теме всего два своих сообщения, и я его понял!!! И что интересно, ему для этого даже не пришлось посылать меня ни на лекции Евгения, ни в библиотеку за даташитом, ни в гугл! И даже рассказывать мне о тяготах своего бытия!
Так я же не англичанин, чтобы писать СВОИ переменные на английском языке! Да и не студент, чтобы параметры функций писать как учили на лекциях! Я знаю что микроконтролеру до лампочки как я пишу переменные! Да и ардуина не ругается на мое йоркширское произношение и сильный российский акцент!
Я, видит Б..г, очень долго игнорировал твой гонор, делая скидку на возраст. Все. Алес.
Зачем так нервничать?! Я же ничего и не от кого не требую, и уже давно написал "Хочешь и знаешь - отвечаешь! Не хочешь или НЕ знаешь - ничего и НЕ отвечаешь! Вот и все!!!"
----------------------------------
Еще раз попробу достучаться: вот какой должен быть код.
1. читаем команду, парсим.
2. читаем следующую, парсим,
3. если можно "склеить" - склеиваем, возвращаемся к п.2.,
4. если больше не склеивается, подготавливает данные для моторов.
5. ждем окончания работы моторов от ранних стадий (до текущего п.1). и передаем моторам новые данные. (если позволит память, можно сделать очередь);
6. возврат к 1.
---
моторы кушают данные через прерывания, само собой, на РАЗНЫХ таймерах. Вообще - тут удобнее использовать СТМ32... но это уже вкусовщина. Мега - в принципе тянет.
А я так и делаю! За исключением того, что использую ОДИН таймер, и не вижу необходимости использовать второй!!!
...Но я вроде сюда не на курсы по программированию МК пришел, чтобы проходить курсы молодого бойца. Со мной можно попроще!..
Зачем ты сюда пришел - всем глубоко безразлично.
На форуме существуют определенные традиции.
У тебя выбор только из двух вариантов:
1. Проходить курс молодого бойца.
2. Заказывать работу за деньги.
Других вариантов нет.