В принципе, если подозрение на неравномерность вследствии переустановки таймера, то может его менять-то только на разгоне-торможении, а на прямом ходе оставить уж в покое - пусть тикает, как в последний раз установлен.
где count_Acceler это 1,2,3 и тд. Фактически это число шагов плавного выхода с полного останова на максимальную скорость или плавного торможения до полного останова.
Массив delay_H[700]рассчитывается только на этапе setup() и никак не вычисляется при выполнении перемещений и приема G-кодов.
wdrakula пишет:
Напиши на русском языке, что код должен делать, в каком виде принимать команды, какой у команд синтаксис? Пока ограничимся только командами движения.
Код должен принимать данные о перемещении из одной точки в другую. Команды принимаются в виде стандартного синтаксиса текстовых строк G-кода. Например G-код"G0 X100.00 Y100.00 " говорит ЧПУ что надо переместится из текущего положения рабочего инструмента в точку с координатами X=100.00 мм и Y=100.00мм. Код "G0" указывет что перемещение должно проводится на макмтмальной скорости, заданной по умолчанию. Если надо перемещаться с другой скоростью, то вместо "G0" пишут "G1"
В данном варианте программы "G0" и "G1"равны.
wdrakula пишет:
Зачем ты хочешь отслеживать цепочки?
Когда происходит движение в одинаковом направлении, то движки вращаются в неизменном направлении, но с разными скоростями для разных углов перемешения сегментов. Вот чтобы обеспечить плавность движения цепочки сегментов и избавиться от рокота нужно знать когда цепочка сегментов оборвется, и любой из движков изменит свое направление вращение на обратное, или остановится.
Поскольку перемещение происходит гораздо медленнее, чем происходит обмен по последовательному порту, я просто, пока происходит перемещение, делаю запрос на следующий G-код программы управления, и если следующий G-код не изменяет направление вращение движков, то я этот сегмент включаю в текущую цепочку и не торможу движки.
wdrakula пишет:
Почему эту работу не отдать отпимизатору G-кода, а не станку?
А кто у нас будет отпимизатору G-кода?
wdrakula пишет:
Команда перемещения - это разгон+движение+торможение. Если два перемещения состыкованы, то какие случаи станок должен (по твоему мнению) должен отслеживать?
Вообще-то я делаю не станок, а что-то типа автоматической воздушной паяльной станции, которая должна нагреть некий периметр (квадрат, прямоугольник, круг, овал, и тп) на печатной плате и либо выпаять компонет, либо припаять его, либо нанести флюс или паяльную пасту и пропаять компонент.
wdrakula пишет:
Может попробовать сперва на одной оси -X? для отладки? Напиши словами - какую идею ты хочешь отладить?
Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?
В принципе, если подозрение на неравномерность вследствии переустановки таймера, то может его менять-то только на разгоне-торможении, а на прямом ходе оставить уж в покое - пусть тикает, как в последний раз установлен.
Если учитывать, что разгон на максимальную скорость в данной программе происходит за 625 шагов (или за 6.25 милииметра), то данное предожение можно использовать только для отрезков длиной выше 13 милиметров!!!
А вообще-то, стрОки с 13 по 17
Цитата:
if ( count_ <= max_count_Acceleration ){ stepCount = count_ ; } // если разгоняемся
if ( stepCount >= Delta_Move ) { stepCount = Delta_Move ; } // если тормозим
как раз это и выполняют!
Ведь после того как добрались до max_count_Acceleration, счетчик шагов разгона и торможения stepCount не изменяется и равен count_ и остается на этом значении до тех пор, пока остоток шагов перемещения Delta_Move не достигнет значения равногоstepCount !
где count_Acceler это 1,2,3 и тд. Фактически это число шагов плавного выхода с полного останова на максимальную скорость или плавного торможения до полного останова.
Массив delay_H[700]рассчитывается только на этапе setup() и никак не вычисляется при выполнении перемещений и приема G-кодов.
Кат вот посмотри на этот код, черт побери! На условие завершения цикла! Блин!
Я готов помогать с поиском сложных вещей, а не ловлей блох!!!!!!!!!! Перечитай код, это, с позволения сказать, "функции".
И да, это уже вкусовщина, но паскализм "подпрограмма" - очень бесит. К слову - мой первый язык (после "Квантовской" Рапиры) - был Паскаль... ужас и страшный сон пьяного Вирта! ;) - это сарказм, если что.
ALEGYR пишет:
Код должен принимать данные о перемещении из одной точки в другую. Команды принимаются в виде стандартного синтаксиса текстовых строк G-кода. Например G-код"G0 X100.00 Y100.00 " говорит ЧПУ что надо переместится из текущего положения рабочего инструмента в точку с координатами X=100.00 мм и Y=100.00мм. Код "G0" указывет что перемещение должно проводится на макмтмальной скорости, заданной по умолчанию. Если надо перемещаться с другой скоростью, то вместо "G0" пишут "G1"
В данном варианте программы "G0" и "G1"равны.
спасибо, язнаю про G-код ;). Ты можешь описать подмножество команд в целях тестирования?
ALEGYR пишет:
А кто у нас будет отпимизатору G-кода?
внешняя программа. Написать, нет? ;)
ALEGYR пишет:
wdrakula пишет:
Команда перемещения - это разгон+движение+торможение. Если два перемещения состыкованы, то какие случаи станок должен (по твоему мнению) должен отслеживать?
Вообще-то я делаю не станок, а что-то типа автоматической воздушной паяльной станции, которая должна нагреть некий периметр (квадрат, прямоугольник, круг, овал, и тп) на печатной плате и либо выпаять компонет, либо припаять его, либо нанести флюс или паяльную пасту и пропаять компонент.
Это как-то меняет мой вопрос?
ALEGYR пишет:
Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?
Ты реально задолбал не относящимся к делу вопросом! Прости, я не хочу обидеть - это эмоции!.
Ответ: Потому, что делает неравномерность незаметной.
Ошибка в обработке стыковки команд G-кода. Вся логика обработки G-кода требует полной переделки. Если есть желание, можно аккуратно переписать с моей помощью. Только одно правило - никаких споров!!!
Например я сказал, что Calculation_max_count_Acceleration_() написана совсем неверно. Будь добр - сам найди ошибку и перепиши. Если ты писал о себе правду, то ты имеешь квалификацию для этого.
Обрати внимание, именно на условие завершения цикла. В таком виде в программе происходит вообще все что угодно, из-за порчи памяти. Спойлер dd - растет в цикле, а что у нас проверяет условие
while (abs(dd) >= delay_min)????
-----------------
Пока остановимся на этом. Важен не размер шага, а то, что шагаем в нужном направлении.
верхняя картинка это движение без тарахтения (то есть С delayMicroseconds(200) ;)
нижняя картинка движение с тарахтением (то есть БЕЗ delayMicroseconds(200) ; )
Видно, конечно, не очень... Стоп раз в 100мс может вызвать постоянное тарахтение при таком плотном шаге? Можете оба лога с Saleae отправить на wrk.sadman@gmail.com? Смоделирую на своём и посмотрю - действительно ли тарахтит.
И да, это уже вкусовщина, но паскализм "подпрограмма" - очень бесит. К слову - мой первый язык (после "Квантовской" Рапиры) - был Паскаль... ужас и страшный сон пьяного Вирта! ;) - это сарказм, если что.
Я понял!
wdrakula пишет:
спасибо, язнаю про G-код ;). Ты можешь описать подмножество команд в целях тестирования?
Команда перемещения - это разгон+движение+торможение. Если два перемещения состыкованы, то какие случаи станок должен (по твоему мнению) должен отслеживать?
Вообще-то я делаю не станок, а что-то типа автоматической воздушной паяльной станции, которая должна нагреть некий периметр (квадрат, прямоугольник, круг, овал, и тп) на печатной плате и либо выпаять компонет, либо припаять его, либо нанести флюс или паяльную пасту и пропаять компонент.
Это как-то меняет мой вопрос?
В принцципе никак!
wdrakula пишет:
ALEGYR пишет:
Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?
Ты реально задолбал не относящимся к делу вопросом! Прости, я не хочу обидеть - это эмоции!.
Я понимаю!
wdrakula пишет:
Ответ: Потому, что делает неравномерность незаметной.
Ошибка в обработке стыковки команд G-кода. Вся логика обработки G-кода требует полной переделки. Если есть желание, можно аккуратно переписать с моей помощью. Только одно правило - никаких споров!!!
Я весь полон внимания!
wdrakula пишет:
Например я сказал, что Calculation_max_count_Acceleration_() написана совсем неверно. Будь добр - сам найди ошибку и перепиши. Если ты писал о себе правду, то ты имеешь квалификацию для этого.
Обрати внимание, именно на условие завершения цикла. В таком виде в программе происходит вообще все что угодно, из-за порчи памяти. Спойлер dd - растет в цикле, а что у нас проверяет условие
while (abs(dd) >= delay_min)????
-----------------
Пока остановимся на этом. Важен не размер шага, а то, что шагаем в нужном направлении.
Ну и как мне его правильно поставить? Если компилятор ардуины на это не ругается, и я с этим циклом спокойно получаю 625 значений массива задержек, которые спокойно использую.
К сожалению, это отрезок перемещения длиной 5 см, с сегментами по 10 мм, и это 5000 шагов за 0.6 секунды.
sadman41 пишет:
Стоп раз в 100мс может вызвать постоянное тарахтение при таком плотном шаге?
Может и раньше, если обрыв шагов будет составлять несколько единиц милисекунд. В данном примере разрыв по cегментам составляет 4.05 милисекунды.
Я, когда услышал тарахтение, специально ввел задержку в подпрограмму обработки прерывания, чтобы раастянуть диаграмму и посмотреть на анализаторе что происходит в местах разрыва шагов. А она взяла и убрала тарахтение!!! Вот тут я и притух! Хотел усилить тарахтение, а получилось что убрал!!! Отсюда и возник вопрос данной темы.
sadman41 пишет:
Можете оба лога с Saleae отправить на wrk.sadman@gmail.com? Смоделирую на своём и посмотрю - действительно ли тарахтит.
Честно говоря, я уже почти 10 лет не игрался с анализатором и забыл как это делается?
Повторюсь сюда: экспериментально подтвердил, что стук начинается от дырок в степе каждые 100 мс (на картинке выше видны). На ненагруженном моторе начинаю слышать его с гапа в 650мкс, нащупывать (так оказалось точнее) - с ~230мкс. От неравномерности хода в 20мкс/шаг такого эффекта нет, так что дело наврядли в междушаговой переустановке таймера в прерывании.
Нужно искать, что в коде каждые 100мс происходит и почему.
UPD: есть предположение, что может гадить конструкция вида
startTime = micros();
...
//delayMicroseconds(200);
...
do {
...чего-то ждем, читаем порт или т.п.
} while (micros() - startTime < 200);
и delayMicroseconds(200) просто не дает циклу ожидания вертется так долго, чтобы он повлиял на степпинг.
ребята, простите меня - я пас на время... дорогого мне пса сегодня похоронил... сорри
Прими мои искренние соболезнования!
Я тебя понимаю. Сам хоронил домашнего питомца (волнистого попугайчика), который прожил в семье 15 лет. Пока летал по квартире и помечал различные места, я не думал что буду переживать если он улетит. Но вот когда его не стало, все домашние сильно переживали, и я в том числе. Он стервец хоть и раздражал каждое утро выходного дня своим свистом, но больше радовал, когда говоил "Давай покурим!" или "Тиша хорошая птичка". Хотели завести другого, но матушка сказала "Не надо! Я второй раз такого не переживу."
Душу грело только то что он прожил у нас 15 лет, а не 10-12 лет как обычно. Значит ему не так плохо было у нас.
Повторюсь сюда: экспериментально подтвердил, что стук начинается от дырок в степе каждые 100 мс (на картинке выше видны).
На картинке, показанной выше, разрывы (дырки) в диаграмме сигнала STEP обусловлены тем что через 100 милисекунд движения заканчивает один сегмент (длиной 10мм) и начинается следующий сегмент (тоже длиной 10мм).
sadman41 пишет:
На ненагруженном моторе начинаю слышать его с гапа в 650мкс, нащупывать (так оказалось точнее) - с ~230мкс. От неравномерности хода в 20мкс/шаг такого эффекта нет, так что дело наврядли в междушаговой переустановке таймера в прерывании.
Правильно, от неравномерности хода в 20мкс/шаг (и даже в 200 или 500 мкс/шаг) такого эффекта нет и не будет! Ведь движение происходит с фазами разгона и торможения, а на этих участках перемещения неравномерность хода постоянно изменяется от 1.66 МИЛИсекнды на первом шаге и до 90 МИКРОсекунд при выходе на максимальную скорость вращения движка
sadman41 пишет:
Нужно искать, что в коде каждые 100мс происходит и почему.
Конечно искать надо в коде. Но не что происходит каждые 100мс ( я писал что это просто время движения по отрезку длиной 10 мм. Будет другой отрезок - будут другие милисекунды), а
1- КУДА уходит программа после окончания сегмента (выполнения условия, записанного в 22 строке подпрограммы обработки прерыванияif( Delta_Move_Segment == count_a )?
2 ЧЕМ она занимается (или ЧТО делает) целых 4 МИЛИсекунды, прежде чем снова займется формированием сигнала STEP?
Узнав это можно понять - почему ввод в код задержки всего на 200 микросекунд убирает разрыв в последовательности сигнала STEP, и делает движение гладким!
P.S.
Письмо твое получил. И первый твой ответ нашел у себя в почте.
1) При неравномерности в 500мкс стук уже будет;
2) Паузы вполне может создавать сам GcodeSender, раз он командует двигаться сегментами (я правильно понимаю?)
3) Он у меня не запустился, а Java я обновлять не буду - она у меня для дела стоит старая.
Надо втыкать вывод куда-нить отладочных millis() или дергать ногой (смотреть потом на лог. анализаторе) когда сегмент кончился и когда начался по команде извне (или как там идет процесс).
Т.е. я могу предположить, что в определенных случаях может вообще тупое зацикливание произойти.
Затем мой думатель закружился (чуть неонка не перегорела даже) в попытке пробежать по вероятным маршрутам алгоритма. Предлагаю для начала как-то линеаризовать процедуры, а потом уже пытаться найти потерянное время.
При старте движения, разгон двигателя обеспечивается изменением пауз между импульсами сигнала STEP.
между 1-м импульсом и 2-м пауза 1.67 мс
между 2-м импульсом и 3-м пауза 1.28 мс (разница 0.39 мс или 390 мкс)
между 3-м импульсом и 4-м пауза 1.07 мс (разница 0.21 мс или 210 мкс)
между 4-м импульсом и 5-м пауза 0.96 мс (разница 0.11 мс или 110 мкс)
и тд
При торможении, изменения пауз происходят в обратном порядке
В реальности, это проявляется именением рабочего звука, похожего на плаваюший по тональности писк. Это нормально, так как частота подачи испульсов STEP лежит в пределах от 600 Гц до 10 кГЦ.
sadman41 пишет:
2) Паузы вполне может создавать сам GcodeSender, раз он командует двигаться сегментами (я правильно понимаю?)
Не может GcodeSender делать эти разрывы, так как все данные о длине сегментов он передает в первые 58 -60 милисекунды при движении первого сегмента, который заанчивается через 150 милисекунды после начала движения.
sadman41 пишет:
3) Он у меня не запустился, а Java я обновлять не буду - она у меня для дела стоит старая.
Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!
sadman41 пишет:
Надо втыкать вывод куда-нить отладочных millis() или дергать ногой (смотреть потом на лог. анализаторе) когда сегмент кончился и когда начался по команде извне (или как там идет процесс).
Процесс идет просто
- принимаем первый G-код, Serial_Report()
- определяем длину перемещения и направление вращения движков. SET_input_data()
- запускаем разгон движения и подаем запрос на следующий G-код process_input_data() и moveToPosition()
- если следующий G-код НЕ ИЗМЕНЯЕТ направление вращение движков, то суммируем длину принятого сегмента с уже выполняемым и подает снова запрос на слудующий G-код.
- если принятый (новый) G-код ИЗМЕНЯЕТнаправление вращение движков, то запоминаем его данные, ничего не передаем в комп, и ждем окончание перемещения по уже выполняемому сегменту. Когда движение по сегменту закончится, то посылаем запрос на следующий G-код, и запускаем движение с разгоном по запомненным данным УЖЕ полученного G-кода. Вот и все!
Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!
Вы сами понимаете, что написали? Эксперт должен искать проблему в указанном дилетантом месте?
Т.е. если бы я пришел к вам и попросил починить невключающийся телевизор просто вспомнив как работает дежурка и взглядом эксперта найти неисправную МС, то вы бы прям сразу кинулись в ея паяльником тыкать?
Вобщем, я изложил свои соображения по поводу проблем потенциальной рекурсии, приводящей к хрен его знает каким задержкам.
Если кто-то другой змеиным глазом в этой замене GOSUB-ов на вызовы функций сможет прям сразу указать точку приложения удара молотком - я немедля выпью за его психическое здоровье.
Вобщем, я изложил свои соображения по поводу проблем потенциальной рекурсии, приводящей к хрен его знает каким задержкам.
Если кто-то другой змеиным глазом в этой замене GOSUB-ов на вызовы функций сможет прям сразу указать точку приложения удара молотком - я немедля выпью за его психическое здоровье.
Правильно ли я понимаю, что добровольный процесс экспертной оценки представленного кода закончен?
Правильно ли я понимаю, что добровольный процесс экспертной оценки представленного кода закончен?
Собираетесь инициировать вариант с принудительными работами? ))
Искать проблему при дефектах в коде смысла не вижу - на моей памяти это ничем хорошим не кончалось. Да и вообще - я подошел сюда только потому, что меня интересовали вопросы возникновения стуков в моторе, так как периодически сталкиваюсь с такими задачами.
Собираетесь инициировать вариант с принудительными работами? ))
Я ничего инициировать не собираюсь! Я, как железячник и новичек в ардуине, своей просьбой
ALEGYR пишет:
Объясните пожалуйста
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
просто хотел узнать у знатоков ардуины и чистых программистов природу метаморфоз, с которыми я столкнулся, и некоторые тонкости организации системы обработки прерываний ардуины меги
sadman41 пишет:
Искать проблему при дефектах в коде смысла не вижу - на моей памяти это ничем хорошим не кончалось. Да и вообще - я подошел сюда только потому, что меня интересовали вопросы возникновения стуков в моторе, так как периодически сталкиваюсь с такими задачами.
Очень жаль! У железячника и программиста была возможность решить общие проблемы.
просто хотел узнать у знатоков ардуины и чистых программистов природу метаморфоз, с которыми я столкнулся, и некоторые тонкости организации системы обработки прерываний ардуины меги
У чистых программистов, конечно, будет свое отдельное мнение, но лично я не вижу в прерывании, как таковом, никаких проблем. Грабли раскиданы вне системы обработки, как вы выразились.
ALEGYR пишет:
Очень жаль! У железячника и программиста была возможность решить общие проблемы.
В данном случае у программиста нет никаких особых проблем. А уж с чего они вдруг стали общими - это очень интересный вопрос. Вроде как меня вы не наняли и сейчас не этап доводки станка по результатам опытной эксплуатации.
У чистых программистов, конечно, будет свое отдельное мнение,
Это я уже понял на первой странице темы, когда мне хором стали объяснять как надо объявлять переменные, которые учавствуют в подпрограмме обработки прерывания, и требовать одному предоставить полый код, а другому сделать из полного кода маленькую программу.
но лично я не вижу в прерывании, как таковом, никаких проблем. Грабли раскиданы вне системы обработки, как вы выразились.
Это я тоже понял! Я только не понял зачем надо было просить логи c ЧУЖОГО анализатора и писать СВОЙ код для СВОЕГО железа, когда вопрос темы задавался для ЧУЖОГО конкретного кода и ЧУЖОГО конкретного железа?!
<span style="line-height:1.5em;">sadman41 пишет:
В данном случае у программиста нет никаких особых проблем.
Я вижу что у программиста нет никаких особых проблем. Он просто подошел сюда только потому, что его интересовали вопросы возникновения стуков в моторе, так как он периодически сталкивается с такими задачами.
<span style="line-height:1.5em;">sadman41 пишет:
А уж с чего они вдруг стали общими - это очень интересный вопрос.
Так моторы-то стучат у обоих! Только у одного они стучат по причине якобы неравномерности последовательности импульсов STEP, а у другого они стучат только тогда, когда отрезок кривой перемещения разбивается на отдельные мелкие сегменты. Причем стучат только когда в коде нет врнменной задержки в 100-200 микросекунд, и НЕ стучат, когда задержка есть!
Это я уже понял на первой странице темы, когда мне хором стали объяснять как надо объявлять переменные
Если вы попробуете подсветить себе зажигалкой, чтобы посмотреть, сколько бензина осталось в баке, то окружающие вам так же наперебой начнут объяснять разное. Даже не потому, что они знают больше вас.
Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!
Вы сами понимаете, что написали? Эксперт должен искать проблему в указанном дилетантом месте?
Конечно понимаю! Эксперт должен был искать проблему не в указанном дилетантом месте, а в представленном дилетантом тексте программы!
sadman41 пишет:
Т.е. если бы я пришел к вам и попросил починить невключающийся телевизор просто вспомнив как работает дежурка и взглядом эксперта найти неисправную МС, то вы бы прям сразу кинулись в ея паяльником тыкать?
Если бы ты ко мне пришел, и попросил меня починить невключающийся телевизор, то я бы просто тебе сказал, что я уже лет двадцать не ремонтирую телевизоры и посоветовал бы обратиться к специалисту, и даже мог бы дать телефон такого специалиста. А вот если бы ты ко мне пришел, и попросил меня починить видеокамеру, то я бы спросил модель видеокамеры и попросил рассказать как проявляется дефект. После чего я бы сказал что с ней случилось и во что тебе это обойдется даже без стоимости моих услуг. Вполне возможно тебе бы просто пришлось бы съездить в магазин и купить себе чистящую кассету.
Если вы попробуете подсветить себе зажигалкой, чтобы посмотреть, сколько бензина осталось в баке, то окружающие вам так же наперебой начнут объяснять разное. Даже не потому, что они знают больше вас.
Так бак-то был прозрачный! Да и не бензин в нем был, а вода!!!
А я уже понял, что тут предпочитают раскрашивать свои экранчики, и не любят раскрашивать чужие. Писать свои этюды для начинающих, и не любят читать этюды самих начинающих. В своих-то задачках ответы всегда совпрадут, а вот на чужих можно и облажаться!
А я уже понял, что тут предпочитают раскрашивать свои экранчики, и не любят раскрашивать чужие. Писать свои этюды для начинающих, и не любят читать этюды самих начинающих. В своих-то задачках ответы всегда совпрадут, а вот на чужих можно и облажаться!
Читаю тему и не могу понять: Вы ещё до сих пор не поняли местных обитателей?!? Два года взад сам был таким .. дошло быстрей, однако. Стоит тут вклиниться - как сразу набегут ветеринары .. поэтому уже с тех пор и НЕ советую никому и ничего..
Лично мне хватило того что, библиотекой arhat.h пользовались те, кто её (и меня заодно) же тут и обсирает до сих пор, хотя писана она была исключительно как "вспомнить язык после 17-и летнего перерыва" .. так "на пробу".
Я правильно понимаю, что вы крайне неудовлетворены темпами решения ваших проблем обитателями здешнего форума ?
Нет не правильно! Ведь я не ставил условий по решению своих проблем, и тему открыл не в разделе ищу исполнителя, а в разделе в котором обсуждаются вопросы программирования ардуины. Я надеялся получить от специалистов ответы на свои вопросы, но пока я их не получил. Я понимаю, что у специалистов есть более выжные дела, и они сюда не очень часто заходят, но надеюсь у кого-то появится хорошее настроение и они мне объяснят
ALEGYR пишет:
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
или дадут ссылки на приличную литературу или сайты, где описаны особенности использования системы прерываний в средепроектирования электронных устройств, имеюшей название "ардуино".
Извини, полноценно вникать еще не готов. Но тут повторю:
1.НИКАКИХ ПРОБЛЕММ нет в прерывании. Задержка влияет чисто случайно. Ошибка в остальном коде. Про скрытую рекурсию тебе уже написали. Там еще очень много говна... его раскапывать нужно, мне пока некогда.
2. Книга про "ситему прерываний" это даташит ссылку я давал, там все очень подробно и с примерами на С и асме. Ну не может же тебе мешать то, что он на аглицком??!! Возможно где-то что-то есть на русском... вообще не интересовался, но тут были люди, которые искали.
Читаю тему и не могу понять: Вы ещё до сих пор не поняли местных обитателей?!?
Хотите реальную помощь - ищите иное место.
У меня уже давно нет никаких иллюзий в том что сегодня из себя представляет нынешний интернет и его профильные форумы. Просто, варясь в собственном соку начинает замыливаться глаз, и понимаешь что можно послушать и совет "дурачка"!
Извини, полноценно вникать еще не готов. Но тут повторю:
1.НИКАКИХ ПРОБЛЕММ нет в прерывании. Задержка влияет чисто случайно. Ошибка в остальном коде. Про скрытую рекурсию тебе уже написали. Там еще очень много говна... его раскапывать нужно, мне пока некогда.
Ничего, я подожду!
wdrakula пишет:
2. Книга про "ситему прерываний" это даташит ссылку я давал, там все очень подробно и с примерами на С и асме.
Книгу про "систему прерываний" на которую ты мне дал ссылку это даташит на семейство микроконтролеров ATmega640/V-1280/V-1281/V-2560/V-2561/V , а ардуино это не микроконтролер, а
Цитата:
инструмент для проектирования электронных устройств (электронный конструктор) более плотно взаимодействующих с окружающей физической средой, чем стандартные персональные компьютеры, которые фактически не выходят за рамки виртуальности.
Ну не может же тебе мешать то, что он на аглицком??!! Возможно где-то что-то есть на русском... вообще не интересовался, но тут были люди, которые искали.
Мне аглицкий уже с 1995 года не мешает! Мне больше мешают активные интернетовские доброжелатели, оперирующие в своих объяснениях общими фразами, и ссылками на свою постоянную занятость!
Хотел объяснить по-человечески, но после "послушать дурачков" и отказа вникать в даташит к МК (систему прерываний которого сам же требовал вспомнить для поиска проблемы там, где ее нет), мотивируя тем, что "ардуино это не микроконтролер", считаю, что надо просто сливать воду.
Я, конечно, понимаю, что долгая жись в сервисмэнах отшибает мозги напрочь и без сервис-мануала, а так же консультаций вышестоящего сервис-центра, уже не чихнуть и не пернуть нормально самостоятельно не выходит. Видел даже таких, которые бита от байта не отличали и не хотели, но с умным видом лили прошивки в телики.
Знакомо мне это всё - сервис-мануала нет, сонька не отвечает, потому что аппарат не на гарантии - досвидос, клиент, ваша мясорубка неремонтопригодна. А как самому что понадобилось - так все стелиться должны и искать в безумном коде ошибки, да еще и объяснять их.
В принципе, если подозрение на неравномерность вследствии переустановки таймера, то может его менять-то только на разгоне-торможении, а на прямом ходе оставить уж в покое - пусть тикает, как в последний раз установлен.
в программе такое количество ляпов и ошибок, что прости, но я устал пытаться понять, как она разбирает команды.
Я понимаю что в чужую программу не так легко сходу въехать, но если в глаза сразу бросаются ошибки то отметить их и скажи в чем ошибка.
Что ты подразумеваешь под словом команда?
Шаги разгона и тороможения вычисляются подпрограмой
Calculation_max_count_Acceleration_()
по формуле
dd = delay_HIGH * (sqrt(count_Acceler + 1) - sqrt(count_Acceler) ) ;
где count_Acceler это 1,2,3 и тд. Фактически это число шагов плавного выхода с полного останова на максимальную скорость или плавного торможения до полного останова.
Массив delay_H[700] рассчитывается только на этапе setup() и никак не вычисляется при выполнении перемещений и приема G-кодов.
Код должен принимать данные о перемещении из одной точки в другую. Команды принимаются в виде стандартного синтаксиса текстовых строк G-кода. Например G-код "G0 X100.00 Y100.00 " говорит ЧПУ что надо переместится из текущего положения рабочего инструмента в точку с координатами X=100.00 мм и Y=100.00мм. Код "G0" указывет что перемещение должно проводится на макмтмальной скорости, заданной по умолчанию. Если надо перемещаться с другой скоростью, то вместо "G0" пишут "G1"
В данном варианте программы "G0" и "G1"равны.
Когда происходит движение в одинаковом направлении, то движки вращаются в неизменном направлении, но с разными скоростями для разных углов перемешения сегментов. Вот чтобы обеспечить плавность движения цепочки сегментов и избавиться от рокота нужно знать когда цепочка сегментов оборвется, и любой из движков изменит свое направление вращение на обратное, или остановится.
Поскольку перемещение происходит гораздо медленнее, чем происходит обмен по последовательному порту, я просто, пока происходит перемещение, делаю запрос на следующий G-код программы управления, и если следующий G-код не изменяет направление вращение движков, то я этот сегмент включаю в текущую цепочку и не торможу движки.
А кто у нас будет отпимизатору G-кода?
Вообще-то я делаю не станок, а что-то типа автоматической воздушной паяльной станции, которая должна нагреть некий периметр (квадрат, прямоугольник, круг, овал, и тп) на печатной плате и либо выпаять компонет, либо припаять его, либо нанести флюс или паяльную пасту и пропаять компонент.
Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?
Я бы лично прицепился на Step логическим анализатором и посмотрел на равномерность хода при тарахтении.
В принципе, если подозрение на неравномерность вследствии переустановки таймера, то может его менять-то только на разгоне-торможении, а на прямом ходе оставить уж в покое - пусть тикает, как в последний раз установлен.
Если учитывать, что разгон на максимальную скорость в данной программе происходит за 625 шагов (или за 6.25 милииметра), то данное предожение можно использовать только для отрезков длиной выше 13 милиметров!!!
А вообще-то, стрОки с 13 по 17
Я бы лично прицепился на Step логическим анализатором и посмотрел на равномерность хода при тарахтении.
А я уже цеплялся, и даже хотел показать картинки, но мне сказали что этого делать не надо.
Если теперь надо то показываю
верхняя картинка это движение без тарахтения (то есть С delayMicroseconds(200) ;)
нижняя картинка движение с тарахтением (то есть БЕЗ delayMicroseconds(200) ; )
Что ты подразумеваешь под словом команда?
команда G-кода
Шаги разгона и тороможения вычисляются подпрограмой
Calculation_max_count_Acceleration_()
по формуле
dd = delay_HIGH * (sqrt(count_Acceler + 1) - sqrt(count_Acceler) ) ;
где count_Acceler это 1,2,3 и тд. Фактически это число шагов плавного выхода с полного останова на максимальную скорость или плавного торможения до полного останова.
Массив delay_H[700] рассчитывается только на этапе setup() и никак не вычисляется при выполнении перемещений и приема G-кодов.
Кат вот посмотри на этот код, черт побери! На условие завершения цикла! Блин!
Я готов помогать с поиском сложных вещей, а не ловлей блох!!!!!!!!!! Перечитай код, это, с позволения сказать, "функции".
И да, это уже вкусовщина, но паскализм "подпрограмма" - очень бесит. К слову - мой первый язык (после "Квантовской" Рапиры) - был Паскаль... ужас и страшный сон пьяного Вирта! ;) - это сарказм, если что.
Код должен принимать данные о перемещении из одной точки в другую. Команды принимаются в виде стандартного синтаксиса текстовых строк G-кода. Например G-код "G0 X100.00 Y100.00 " говорит ЧПУ что надо переместится из текущего положения рабочего инструмента в точку с координатами X=100.00 мм и Y=100.00мм. Код "G0" указывет что перемещение должно проводится на макмтмальной скорости, заданной по умолчанию. Если надо перемещаться с другой скоростью, то вместо "G0" пишут "G1"
В данном варианте программы "G0" и "G1"равны.
спасибо, язнаю про G-код ;). Ты можешь описать подмножество команд в целях тестирования?
А кто у нас будет отпимизатору G-кода?
внешняя программа. Написать, нет? ;)
Вообще-то я делаю не станок, а что-то типа автоматической воздушной паяльной станции, которая должна нагреть некий периметр (квадрат, прямоугольник, круг, овал, и тп) на печатной плате и либо выпаять компонет, либо припаять его, либо нанести флюс или паяльную пасту и пропаять компонент.
Это как-то меняет мой вопрос?
Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?
Ты реально задолбал не относящимся к делу вопросом! Прости, я не хочу обидеть - это эмоции!.
Ответ: Потому, что делает неравномерность незаметной.
Ошибка в обработке стыковки команд G-кода. Вся логика обработки G-кода требует полной переделки. Если есть желание, можно аккуратно переписать с моей помощью. Только одно правило - никаких споров!!!
Например я сказал, что Calculation_max_count_Acceleration_() написана совсем неверно. Будь добр - сам найди ошибку и перепиши. Если ты писал о себе правду, то ты имеешь квалификацию для этого.
Обрати внимание, именно на условие завершения цикла. В таком виде в программе происходит вообще все что угодно, из-за порчи памяти. Спойлер dd - растет в цикле, а что у нас проверяет условие
while (abs(dd) >= delay_min)????
-----------------
Пока остановимся на этом. Важен не размер шага, а то, что шагаем в нужном направлении.
верхняя картинка это движение без тарахтения (то есть С delayMicroseconds(200) ;)
нижняя картинка движение с тарахтением (то есть БЕЗ delayMicroseconds(200) ; )
Видно, конечно, не очень... Стоп раз в 100мс может вызвать постоянное тарахтение при таком плотном шаге? Можете оба лога с Saleae отправить на wrk.sadman@gmail.com? Смоделирую на своём и посмотрю - действительно ли тарахтит.
Кат вот посмотри на этот код, черт побери! На условие завершения цикла! Блин!
Я готов помогать с поиском сложных вещей, а не ловлей блох!!!!!!!!!! Перечитай код, это, с позволения сказать, "функции".
И что в этом коде тебя так бесит?
И да, это уже вкусовщина, но паскализм "подпрограмма" - очень бесит. К слову - мой первый язык (после "Квантовской" Рапиры) - был Паскаль... ужас и страшный сон пьяного Вирта! ;) - это сарказм, если что.
Я понял!
спасибо, язнаю про G-код ;). Ты можешь описать подмножество команд в целях тестирования?
Я уже его давал в своем сообщении с номером 49!
А кто у нас будет отпимизатору G-кода?
внешняя программа. Написать, нет? ;)
Так и о ней я уже писал в этом же 49 сообщении
Вообще-то я делаю не станок, а что-то типа автоматической воздушной паяльной станции, которая должна нагреть некий периметр (квадрат, прямоугольник, круг, овал, и тп) на печатной плате и либо выпаять компонет, либо припаять его, либо нанести флюс или паяльную пасту и пропаять компонент.
Это как-то меняет мой вопрос?
В принцципе никак!
Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?
Ты реально задолбал не относящимся к делу вопросом! Прости, я не хочу обидеть - это эмоции!.
Я понимаю!
Ответ: Потому, что делает неравномерность незаметной.
Ошибка в обработке стыковки команд G-кода. Вся логика обработки G-кода требует полной переделки. Если есть желание, можно аккуратно переписать с моей помощью. Только одно правило - никаких споров!!!
Я весь полон внимания!
Например я сказал, что Calculation_max_count_Acceleration_() написана совсем неверно. Будь добр - сам найди ошибку и перепиши. Если ты писал о себе правду, то ты имеешь квалификацию для этого.
Обрати внимание, именно на условие завершения цикла. В таком виде в программе происходит вообще все что угодно, из-за порчи памяти. Спойлер dd - растет в цикле, а что у нас проверяет условие
while (abs(dd) >= delay_min)????
-----------------
Пока остановимся на этом. Важен не размер шага, а то, что шагаем в нужном направлении.
Ну и как мне его правильно поставить? Если компилятор ардуины на это не ругается, и я с этим циклом спокойно получаю 625 значений массива задержек, которые спокойно использую.
сорри, я уже лег. с телефона пишу. подумай о том, как этот цикл вообще останавливается? и куда он пишет после 699?
сорри. мой недосмотр. там разность корней. сходится. цикл завершится. этот вопрос снят. моя вина.
Видно, конечно, не очень...
К сожалению, это отрезок перемещения длиной 5 см, с сегментами по 10 мм, и это 5000 шагов за 0.6 секунды.
Стоп раз в 100мс может вызвать постоянное тарахтение при таком плотном шаге?
Может и раньше, если обрыв шагов будет составлять несколько единиц милисекунд. В данном примере разрыв по cегментам составляет 4.05 милисекунды.
Я, когда услышал тарахтение, специально ввел задержку в подпрограмму обработки прерывания, чтобы раастянуть диаграмму и посмотреть на анализаторе что происходит в местах разрыва шагов. А она взяла и убрала тарахтение!!! Вот тут я и притух! Хотел усилить тарахтение, а получилось что убрал!!! Отсюда и возник вопрос данной темы.
Можете оба лога с Saleae отправить на wrk.sadman@gmail.com? Смоделирую на своём и посмотрю - действительно ли тарахтит.
Честно говоря, я уже почти 10 лет не игрался с анализатором и забыл как это делается?
P.S
Вроде сохраннил и отправил.
Бывает!
sadman41, ты логи мои получил?
Получил. И ответил на письмо: это один и тот же лог, но под разными именами.
sadman41, ответа я не получал!
Извини за ляп! Если все еще нужен второй файл, то могу выслать, или разместить тут!
sadman41, ответа я не получал!
Извини за ляп! Если все еще нужен второй файл, то могу выслать, или разместить тут!
Ответ был: Tue, Oct 16, 9:18 AM (1 day ago)
выслал на почту в 17.04
Повторюсь сюда: экспериментально подтвердил, что стук начинается от дырок в степе каждые 100 мс (на картинке выше видны). На ненагруженном моторе начинаю слышать его с гапа в 650мкс, нащупывать (так оказалось точнее) - с ~230мкс. От неравномерности хода в 20мкс/шаг такого эффекта нет, так что дело наврядли в междушаговой переустановке таймера в прерывании.
Нужно искать, что в коде каждые 100мс происходит и почему.
UPD: есть предположение, что может гадить конструкция вида
и delayMicroseconds(200) просто не дает циклу ожидания вертется так долго, чтобы он повлиял на степпинг.
ребята, простите меня - я пас на время... дорогого мне пса сегодня похоронил... сорри
ребята, простите меня - я пас на время... дорогого мне пса сегодня похоронил... сорри
Прими мои искренние соболезнования!
Я тебя понимаю. Сам хоронил домашнего питомца (волнистого попугайчика), который прожил в семье 15 лет. Пока летал по квартире и помечал различные места, я не думал что буду переживать если он улетит. Но вот когда его не стало, все домашние сильно переживали, и я в том числе. Он стервец хоть и раздражал каждое утро выходного дня своим свистом, но больше радовал, когда говоил "Давай покурим!" или "Тиша хорошая птичка". Хотели завести другого, но матушка сказала "Не надо! Я второй раз такого не переживу."
Душу грело только то что он прожил у нас 15 лет, а не 10-12 лет как обычно. Значит ему не так плохо было у нас.
Еще раз прими мои искренние соболезнования.
Я тебя понимаю.
Выпью вечером за
Повторюсь сюда: экспериментально подтвердил, что стук начинается от дырок в степе каждые 100 мс (на картинке выше видны).
На картинке, показанной выше, разрывы (дырки) в диаграмме сигнала STEP обусловлены тем что через 100 милисекунд движения заканчивает один сегмент (длиной 10мм) и начинается следующий сегмент (тоже длиной 10мм).
Правильно, от неравномерности хода в 20мкс/шаг (и даже в 200 или 500 мкс/шаг) такого эффекта нет и не будет! Ведь движение происходит с фазами разгона и торможения, а на этих участках перемещения неравномерность хода постоянно изменяется от 1.66 МИЛИсекнды на первом шаге и до 90 МИКРОсекунд при выходе на максимальную скорость вращения движка
Конечно искать надо в коде. Но не что происходит каждые 100мс ( я писал что это просто время движения по отрезку длиной 10 мм. Будет другой отрезок - будут другие милисекунды), а
1- КУДА уходит программа после окончания сегмента (выполнения условия, записанного в 22 строке подпрограммы обработки прерывания
if
( Delta_Move_Segment == count_a )
?2 ЧЕМ она занимается (или ЧТО делает) целых 4 МИЛИсекунды, прежде чем снова займется формированием сигнала STEP?
Узнав это можно понять - почему ввод в код задержки всего на 200 микросекунд убирает разрыв в последовательности сигнала STEP, и делает движение гладким!
P.S.
Письмо твое получил. И первый твой ответ нашел у себя в почте.
1) При неравномерности в 500мкс стук уже будет;
2) Паузы вполне может создавать сам GcodeSender, раз он командует двигаться сегментами (я правильно понимаю?)
3) Он у меня не запустился, а Java я обновлять не буду - она у меня для дела стоит старая.
Надо втыкать вывод куда-нить отладочных millis() или дергать ногой (смотреть потом на лог. анализаторе) когда сегмент кончился и когда начался по команде извне (или как там идет процесс).
1) При неравномерности в 500мкс стук уже будет;
При старте движения, разгон двигателя обеспечивается изменением пауз между импульсами сигнала STEP.
между 1-м импульсом и 2-м пауза 1.67 мс
между 2-м импульсом и 3-м пауза 1.28 мс (разница 0.39 мс или 390 мкс)
между 3-м импульсом и 4-м пауза 1.07 мс (разница 0.21 мс или 210 мкс)
между 4-м импульсом и 5-м пауза 0.96 мс (разница 0.11 мс или 110 мкс)
и тд
При торможении, изменения пауз происходят в обратном порядке
В реальности, это проявляется именением рабочего звука, похожего на плаваюший по тональности писк. Это нормально, так как частота подачи испульсов STEP лежит в пределах от 600 Гц до 10 кГЦ.
2) Паузы вполне может создавать сам GcodeSender, раз он командует двигаться сегментами (я правильно понимаю?)
Не может GcodeSender делать эти разрывы, так как все данные о длине сегментов он передает в первые 58 -60 милисекунды при движении первого сегмента, который заанчивается через 150 милисекунды после начала движения.
3) Он у меня не запустился, а Java я обновлять не буду - она у меня для дела стоит старая.
Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!
Процесс идет просто
- принимаем первый G-код, Serial_Report()
- определяем длину перемещения и направление вращения движков. SET_input_data()
- запускаем разгон движения и подаем запрос на следующий G-код process_input_data() и moveToPosition()
- если следующий G-код НЕ ИЗМЕНЯЕТ направление вращение движков, то суммируем длину принятого сегмента с уже выполняемым и подает снова запрос на слудующий G-код.
- если принятый (новый) G-код ИЗМЕНЯЕТ направление вращение движков, то запоминаем его данные, ничего не передаем в комп, и ждем окончание перемещения по уже выполняемому сегменту. Когда движение по сегменту закончится, то посылаем запрос на следующий G-код, и запускаем движение с разгоном по запомненным данным УЖЕ полученного G-кода. Вот и все!
Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!
Вы сами понимаете, что написали? Эксперт должен искать проблему в указанном дилетантом месте?
Т.е. если бы я пришел к вам и попросил починить невключающийся телевизор просто вспомнив как работает дежурка и взглядом эксперта найти неисправную МС, то вы бы прям сразу кинулись в ея паяльником тыкать?
Вот и все!
Вобщем, я изложил свои соображения по поводу проблем потенциальной рекурсии, приводящей к хрен его знает каким задержкам.
Если кто-то другой змеиным глазом в этой замене GOSUB-ов на вызовы функций сможет прям сразу указать точку приложения удара молотком - я немедля выпью за его психическое здоровье.
Что такое "линеаризовать процедуры"?
Как я пониаю время теряется при выполнении строк
moveNSteps();//
Мне не совсем ясна работа оператора while ( movementDone == false ){...} ?
Как это - вам не совсем ясна? А кто является создателем сего опуса?
Вобщем, я изложил свои соображения по поводу проблем потенциальной рекурсии, приводящей к хрен его знает каким задержкам.
Если кто-то другой змеиным глазом в этой замене GOSUB-ов на вызовы функций сможет прям сразу указать точку приложения удара молотком - я немедля выпью за его психическое здоровье.
Правильно ли я понимаю, что добровольный процесс экспертной оценки представленного кода закончен?
Правильно ли я понимаю, что добровольный процесс экспертной оценки представленного кода закончен?
Собираетесь инициировать вариант с принудительными работами? ))
Искать проблему при дефектах в коде смысла не вижу - на моей памяти это ничем хорошим не кончалось. Да и вообще - я подошел сюда только потому, что меня интересовали вопросы возникновения стуков в моторе, так как периодически сталкиваюсь с такими задачами.
Код обещал пингвин посмотреть, а не я.
Как это - вам не совсем ясна? А кто является создателем сего опуса?
О создателе сего опуса я писал на первой странице темы и предствалял исходник в своем сообщении с номером #23.
могу датьссылку на видео https://www.youtube.com/watch?v=fHAO7SW-SZI&feature=youtu.be
там есть ссылки на скетч и некоторую документацию по теории управления скоростью наговых двигателей.
В исходнике нет странных рекурсий, у вас - есть.
Надо начинать все сначала писать. Такова жись. Или поставить уже GRBL на ардуинку.
Собираетесь инициировать вариант с принудительными работами? ))
Я ничего инициировать не собираюсь! Я, как железячник и новичек в ардуине, своей просьбойALEGYR пишет:
просто хотел узнать у знатоков ардуины и чистых программистов природу метаморфоз, с которыми я столкнулся, и некоторые тонкости организации системы обработки прерываний ардуины меги
Объясните пожалуйста
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
Искать проблему при дефектах в коде смысла не вижу - на моей памяти это ничем хорошим не кончалось. Да и вообще - я подошел сюда только потому, что меня интересовали вопросы возникновения стуков в моторе, так как периодически сталкиваюсь с такими задачами.
Очень жаль! У железячника и программиста была возможность решить общие проблемы.
просто хотел узнать у знатоков ардуины и чистых программистов природу метаморфоз, с которыми я столкнулся, и некоторые тонкости организации системы обработки прерываний ардуины меги
У чистых программистов, конечно, будет свое отдельное мнение, но лично я не вижу в прерывании, как таковом, никаких проблем. Грабли раскиданы вне системы обработки, как вы выразились.
В данном случае у программиста нет никаких особых проблем. А уж с чего они вдруг стали общими - это очень интересный вопрос. Вроде как меня вы не наняли и сейчас не этап доводки станка по результатам опытной эксплуатации.
У чистых программистов, конечно, будет свое отдельное мнение,
Это я уже понял на первой странице темы, когда мне хором стали объяснять как надо объявлять переменные, которые учавствуют в подпрограмме обработки прерывания, и требовать одному предоставить полый код, а другому сделать из полного кода маленькую программу.
но лично я не вижу в прерывании, как таковом, никаких проблем. Грабли раскиданы вне системы обработки, как вы выразились.
Это я тоже понял! Я только не понял зачем надо было просить логи c ЧУЖОГО анализатора и писать СВОЙ код для СВОЕГО железа, когда вопрос темы задавался для ЧУЖОГО конкретного кода и ЧУЖОГО конкретного железа?!
В данном случае у программиста нет никаких особых проблем.
Я вижу что у программиста нет никаких особых проблем. Он просто подошел сюда только потому, что его интересовали вопросы возникновения стуков в моторе, так как он периодически сталкивается с такими задачами.
А уж с чего они вдруг стали общими - это очень интересный вопрос.
Так моторы-то стучат у обоих! Только у одного они стучат по причине якобы неравномерности последовательности импульсов STEP, а у другого они стучат только тогда, когда отрезок кривой перемещения разбивается на отдельные мелкие сегменты. Причем стучат только когда в коде нет врнменной задержки в 100-200 микросекунд, и НЕ стучат, когда задержка есть!
Вроде как меня вы не наняли и сейчас не этап доводки станка по результатам опытной эксплуатации.
Так я ничего и не требую! Я просто просил
Объясните пожалуйста
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
Хочешь и знаешь - отвечаешь! Не хочешь или НЕ знаешь - ничего и НЕ отвечаешь! Вот и все!!!
Если вы попробуете подсветить себе зажигалкой, чтобы посмотреть, сколько бензина осталось в баке, то окружающие вам так же наперебой начнут объяснять разное. Даже не потому, что они знают больше вас.
Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!
Вы сами понимаете, что написали? Эксперт должен искать проблему в указанном дилетантом месте?
Конечно понимаю! Эксперт должен был искать проблему не в указанном дилетантом месте, а в представленном дилетантом тексте программы!
Если бы ты ко мне пришел, и попросил меня починить невключающийся телевизор, то я бы просто тебе сказал, что я уже лет двадцать не ремонтирую телевизоры и посоветовал бы обратиться к специалисту, и даже мог бы дать телефон такого специалиста. А вот если бы ты ко мне пришел, и попросил меня починить видеокамеру, то я бы спросил модель видеокамеры и попросил рассказать как проявляется дефект. После чего я бы сказал что с ней случилось и во что тебе это обойдется даже без стоимости моих услуг. Вполне возможно тебе бы просто пришлось бы съездить в магазин и купить себе чистящую кассету.
Если вы попробуете подсветить себе зажигалкой, чтобы посмотреть, сколько бензина осталось в баке, то окружающие вам так же наперебой начнут объяснять разное. Даже не потому, что они знают больше вас.
Так бак-то был прозрачный! Да и не бензин в нем был, а вода!!!
Если повезет, вы позже поймете, про какую "воду" вам говорили "хором". Ну а нет, так нет.
А я уже понял, что тут предпочитают раскрашивать свои экранчики, и не любят раскрашивать чужие. Писать свои этюды для начинающих, и не любят читать этюды самих начинающих. В своих-то задачках ответы всегда совпрадут, а вот на чужих можно и облажаться!
Я правильно понимаю, что вы крайне неудовлетворены темпами решения ваших проблем обитателями здешнего форума ?
А я уже понял, что тут предпочитают раскрашивать свои экранчики, и не любят раскрашивать чужие. Писать свои этюды для начинающих, и не любят читать этюды самих начинающих. В своих-то задачках ответы всегда совпрадут, а вот на чужих можно и облажаться!
Лично мне хватило того что, библиотекой arhat.h пользовались те, кто её (и меня заодно) же тут и обсирает до сих пор, хотя писана она была исключительно как "вспомнить язык после 17-и летнего перерыва" .. так "на пробу".
Хотите реальную помощь - ищите иное место.
Я правильно понимаю, что вы крайне неудовлетворены темпами решения ваших проблем обитателями здешнего форума ?
Нет не правильно! Ведь я не ставил условий по решению своих проблем, и тему открыл не в разделе ищу исполнителя, а в разделе в котором обсуждаются вопросы программирования ардуины. Я надеялся получить от специалистов ответы на свои вопросы, но пока я их не получил. Я понимаю, что у специалистов есть более выжные дела, и они сюда не очень часто заходят, но надеюсь у кого-то появится хорошее настроение и они мне объяснят
1 - Откуда у этой метаморфозы ноги растут?
2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?
или дадут ссылки на приличную литературу или сайты, где описаны особенности использования системы прерываний в среде проектирования электронных устройств, имеюшей название "ардуино".
Извини, полноценно вникать еще не готов. Но тут повторю:
1.НИКАКИХ ПРОБЛЕММ нет в прерывании. Задержка влияет чисто случайно. Ошибка в остальном коде. Про скрытую рекурсию тебе уже написали. Там еще очень много говна... его раскапывать нужно, мне пока некогда.
2. Книга про "ситему прерываний" это даташит ссылку я давал, там все очень подробно и с примерами на С и асме. Ну не может же тебе мешать то, что он на аглицком??!! Возможно где-то что-то есть на русском... вообще не интересовался, но тут были люди, которые искали.
Читаю тему и не могу понять: Вы ещё до сих пор не поняли местных обитателей?!?
Хотите реальную помощь - ищите иное место.
У меня уже давно нет никаких иллюзий в том что сегодня из себя представляет нынешний интернет и его профильные форумы. Просто, варясь в собственном соку начинает замыливаться глаз, и понимаешь что можно послушать и совет "дурачка"!
Извини, полноценно вникать еще не готов. Но тут повторю:
1.НИКАКИХ ПРОБЛЕММ нет в прерывании. Задержка влияет чисто случайно. Ошибка в остальном коде. Про скрытую рекурсию тебе уже написали. Там еще очень много говна... его раскапывать нужно, мне пока некогда.
Ничего, я подожду!
2. Книга про "ситему прерываний" это даташит ссылку я давал, там все очень подробно и с примерами на С и асме.
Книгу про "систему прерываний" на которую ты мне дал ссылку это даташит на семейство микроконтролеров ATmega640/V-1280/V-1281/V-2560/V-2561/V , а ардуино это не микроконтролер, а
см http://arduino.ru/About
и
см http://arduino.ru/About
Мне аглицкий уже с 1995 года не мешает! Мне больше мешают активные интернетовские доброжелатели, оперирующие в своих объяснениях общими фразами, и ссылками на свою постоянную занятость!
Спасибо тебе. Очень желаю, чтобы у тебя тоже умер близкий друг.
Все-таки редкая ты мразь!
Хотел объяснить по-человечески, но после "послушать дурачков" и отказа вникать в даташит к МК (систему прерываний которого сам же требовал вспомнить для поиска проблемы там, где ее нет), мотивируя тем, что "ардуино это не микроконтролер", считаю, что надо просто сливать воду.
Я, конечно, понимаю, что долгая жись в сервисмэнах отшибает мозги напрочь и без сервис-мануала, а так же консультаций вышестоящего сервис-центра, уже не чихнуть и не пернуть нормально самостоятельно не выходит. Видел даже таких, которые бита от байта не отличали и не хотели, но с умным видом лили прошивки в телики.
Знакомо мне это всё - сервис-мануала нет, сонька не отвечает, потому что аппарат не на гарантии - досвидос, клиент, ваша мясорубка неремонтопригодна. А как самому что понадобилось - так все стелиться должны и искать в безумном коде ошибки, да еще и объяснять их.
Спасибо тебе. Очень желаю, чтобы у тебя тоже умер близкий друг.
Все-таки редкая ты мразь!
Зря ты так! Ведь я же написал, что понимаю твое состояние, подожду когда у тебя все уляжется!
А фраза про то что мне мешает в интернетовском общении это просто ответ на твой вопрос про английский язык.