Объясните метаморфозу с обработкой прерывания

sadman41
Offline
Зарегистрирован: 19.10.2016

В принципе, если подозрение на неравномерность вследствии переустановки таймера, то может его менять-то только на разгоне-торможении, а на прямом ходе оставить уж в покое - пусть тикает, как в последний раз установлен.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

wdrakula пишет:

в программе такое количество ляпов и ошибок, что прости, но я устал пытаться понять, как она разбирает команды.

Я понимаю что в чужую программу не так легко сходу въехать,  но если в глаза сразу бросаются ошибки то отметить их и  скажи в чем ошибка.

wdrakula пишет:
 То есть ясно, что в моменте стыковки команд возникает неравномерность шага... но в каком месте - это тайна. ;) 

Что ты подразумеваешь под словом команда?

wdrakula пишет:
 в коде, представленном мне, даже шаги разгона-торможения вычисляются неверно., тип команды всегда один и пр. и пр. Посмотри на массив delay_H! ;)

Шаги разгона и тороможения вычисляются подпрограмой

Calculation_max_count_Acceleration_()

по формуле  

dd = delay_HIGH * (sqrt(count_Acceler + 1) - sqrt(count_Acceler) ) ;

где 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 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы лично прицепился на Step логическим анализатором и посмотрел на равномерность хода при тарахтении.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

В принципе, если подозрение на неравномерность вследствии переустановки таймера, то может его менять-то только на разгоне-торможении, а на прямом ходе оставить уж в покое - пусть тикает, как в последний раз установлен.

Если учитывать, что разгон на максимальную скорость в данной программе происходит за 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 !
ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

Я бы лично прицепился на Step логическим анализатором и посмотрел на равномерность хода при тарахтении.

А я уже цеплялся, и даже хотел показать картинки, но мне сказали что этого делать не надо. 

Если теперь надо то показываю

верхняя картинка это движение без тарахтения (то есть С delayMicroseconds(200) ;)

нижняя картинка движение с тарахтением (то есть БЕЗ delayMicroseconds(200) ; )

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ALEGYR пишет:

Что ты подразумеваешь под словом команда?

команда G-кода

ALEGYR пишет:

Шаги разгона и тороможения вычисляются подпрограмой

Calculation_max_count_Acceleration_()

по формуле  

dd = delay_HIGH * (sqrt(count_Acceler + 1) - sqrt(count_Acceler) ) ;

где 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)????

-----------------

Пока остановимся на этом. Важен не размер шага, а то, что шагаем в нужном направлении.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

ALEGYR пишет:

верхняя картинка это движение без тарахтения (то есть С delayMicroseconds(200) ;)

нижняя картинка движение с тарахтением (то есть БЕЗ delayMicroseconds(200) ; )

Видно, конечно, не очень... Стоп раз в 100мс может вызвать постоянное тарахтение при таком плотном шаге? Можете оба лога с Saleae отправить на wrk.sadman@gmail.com? Смоделирую на своём и посмотрю - действительно ли тарахтит.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

wdrakula пишет:

Кат вот посмотри на этот код, черт побери! На условие завершения цикла! Блин!

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

И что в этом коде тебя так бесит?

324
//*******************************************************************
325
         void Calculation_max_count_Acceleration_()  //
326
//********************************************************************
327
 
328
{
329
   
330
  float dd = delay_HIGH ;          //
331
   
332
  do { 
333
     dd = delay_HIGH * (sqrt(count_Acceler + 1) - sqrt(count_Acceler) ) ;
334
    
335
     int dd_ = dd;                    //
336
     delay_H[count_Acceler] = dd_ ;   //   
337
     count_Acceler++ ;
338
  }
339
  while (abs(dd) >= delay_min);       //
340
   
341
  max_count_Acceleration = count_Acceler - 1 ; // 
342
   
343
}

 

 

wdrakula пишет:

И да, это уже вкусовщина, но паскализм "подпрограмма" - очень бесит. К слову - мой первый язык (после "Квантовской" Рапиры) - был Паскаль... ужас и страшный сон пьяного Вирта! ;)  - это сарказм, если что.

Я понял! 

wdrakula пишет:

спасибо, язнаю про G-код ;). Ты можешь описать подмножество команд в целях тестирования?

Я уже его давал в своем сообщении с номером 49!

ALEGYR]</span></p> <p><span style="line-height:1.5em;">примером использую текстовый файл</span></p> <p>[quote= пишет:

G0 X0.000 Y10.000
G0 X0.000 Y20.000
G0 X0.000 Y30.000
G0 X0.000 Y40.000
G0 X0.000 Y50.000
G0 X50.000 Y50.000 
G0 X50.000 Y0.000
G0 X0.000 Y0.000
 
G0 X0.000 Y50.000
G0 X10.000 Y50.000
G0 X15.000 Y50.000
G0 X20.000 Y50.000
G0 X25.000 Y50.000
G0 X30.000 Y50.000
G0 X35.000 Y50.000
G0 X40.000 Y50.000
G0 X45.000 Y50.000
G0 X50.000 Y50.000 
G0 X50.000 Y0.000
G0 X0.000 Y0.000
 
G0 X0.000 Y50.000
G0 X50.000 Y50.000 
G0 X50.000 Y0.000
G0 X0.000 Y0.000
 
G0 X0.000 Y50.000
G0 X50.000 Y50.000 
G0 X50.000 Y0.000
G0 X0.000 Y0.000
 

wdrakula пишет:

ALEGYR пишет:

А кто у нас будет отпимизатору G-кода?

внешняя программа. Написать, нет? ;)

Так и о ней я уже писал в этом же 49 сообщении

#GcodeSender
 
This program will feed instructions to an serial device one line at a time.
It waits for the ">" character between each send.
 
#
 
# I just want to run it!
 
./java/GcodeSender.jar is compiled and should run.
 
On most systems you can double click it to start.
 
On some you may need to do something like
 
    java -classpath RXTXcomm.jar -Djava.library.path=[path to RXTXcomm.jar] -jar DrawbotGUI.jar
 
#
 
#Drivers
 
Need Arduino code that reads GCode and moves motors?  Try https://github.com/MarginallyClever/gcodecncdemo
 
#
 
#More
 
For the latest version please visit http://www.github.com/MarginallyClever/GcodeSender
 
If you find this free program useful, please send me some beer money.
 
#
 
#Author
 
Dan Royer
2014-01-29

wdrakula пишет:

ALEGYR пишет:

wdrakula пишет:
Команда перемещения - это разгон+движение+торможение. Если два перемещения состыкованы, то какие случаи станок должен (по твоему мнению) должен отслеживать?

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

 

Это как-то меняет мой вопрос?

 

В принцципе никак!

wdrakula пишет:

ALEGYR пишет:

Я хочу узнать ПОЧЕМУ задержка delayMicroseconds(200) ; // в 26 строке подпрограммы обработки прерывания убирает тарахтение при движении по сегментам ?

Ты реально задолбал не относящимся к делу вопросом! Прости, я не хочу обидеть - это эмоции!.

Я понимаю! 

wdrakula пишет:

Ответ: Потому, что делает неравномерность незаметной.

Ошибка в обработке стыковки команд G-кода. Вся логика обработки G-кода требует полной переделки. Если есть желание, можно аккуратно переписать с моей помощью. Только одно правило - никаких споров!!!

Я весь полон внимания! 

wdrakula пишет:

Например я сказал, что Calculation_max_count_Acceleration_() написана совсем неверно. Будь добр - сам найди ошибку и перепиши. Если ты писал о себе правду, то ты имеешь квалификацию для этого.

Обрати внимание, именно на условие завершения цикла. В таком виде в программе происходит вообще все что угодно, из-за порчи памяти. Спойлер dd - растет в цикле, а что у нас проверяет условие

while (abs(dd) >= delay_min)????

-----------------

Пока остановимся на этом. Важен не размер шага, а то, что шагаем в нужном направлении.

 

Ну и как мне его правильно поставить?  Если компилятор ардуины на это не ругается, и я с этим циклом спокойно получаю 625 значений массива задержек,  которые спокойно использую.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

сорри, я уже лег. с телефона пишу. подумай о том, как этот цикл вообще останавливается? и куда он пишет после 699?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

сорри. мой недосмотр. там разность корней. сходится. цикл завершится. этот вопрос снят. моя вина.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

Видно, конечно, не очень... 

 К сожалению, это отрезок перемещения длиной 5 см, с сегментами по 10 мм, и это 5000 шагов за 0.6  секунды. 

sadman41 пишет:

Стоп раз в 100мс может вызвать постоянное тарахтение при таком плотном шаге? 

Может и раньше, если обрыв шагов будет составлять несколько единиц милисекунд. В данном примере разрыв по cегментам составляет 4.05 милисекунды. 

Я, когда услышал тарахтение, специально ввел задержку в подпрограмму обработки прерывания,  чтобы раастянуть диаграмму и посмотреть на анализаторе что происходит в местах разрыва шагов. А она взяла и убрала тарахтение!!! Вот тут я и притух! Хотел усилить тарахтение,  а получилось что убрал!!! Отсюда и возник вопрос данной темы.  

sadman41 пишет:

Можете оба лога с Saleae отправить на wrk.sadman@gmail.com? Смоделирую на своём и посмотрю - действительно ли тарахтит.

Честно говоря, я уже почти 10 лет не игрался с анализатором и забыл как это делается?

P.S

Вроде сохраннил и отправил.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

wdrakula пишет:
сорри. мой недосмотр. там разность корней. сходится. цикл завершится. этот вопрос снят. моя вина.

Бывает!

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41, ты логи мои получил?

sadman41
Offline
Зарегистрирован: 19.10.2016

Получил. И ответил на письмо: это один и тот же лог, но под разными именами.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41, ответа я не получал!

Извини за ляп! Если все еще нужен второй файл, то могу выслать, или разместить тут!

sadman41
Offline
Зарегистрирован: 19.10.2016

ALEGYR пишет:

sadman41, ответа я не получал!

Извини за ляп! Если все еще нужен второй файл, то могу выслать, или разместить тут!

Ответ был: Tue, Oct 16, 9:18 AM (1 day ago)

Присылайте второй файл, мотор у меня пока на столе...
ALEGYR
Offline
Зарегистрирован: 20.09.2018

выслал на почту  в 17.04

sadman41
Offline
Зарегистрирован: 19.10.2016

Повторюсь сюда: экспериментально подтвердил, что стук начинается от дырок в степе каждые 100 мс (на картинке выше видны). На ненагруженном моторе начинаю слышать его с гапа в 650мкс, нащупывать (так оказалось точнее) - с ~230мкс. От неравномерности хода в 20мкс/шаг такого эффекта нет, так что дело наврядли в междушаговой переустановке таймера в прерывании.

Нужно искать, что в коде каждые 100мс происходит и почему.

UPD: есть предположение, что может гадить конструкция вида

startTime = micros();
...
//delayMicroseconds(200);
...
do {
...чего-то ждем, читаем порт или т.п.
} while (micros() - startTime < 200);

и delayMicroseconds(200) просто не дает циклу ожидания вертется так долго, чтобы он повлиял на степпинг.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ребята, простите меня - я пас на время... дорогого мне пса сегодня похоронил... сорри

ALEGYR
Offline
Зарегистрирован: 20.09.2018

wdrakula пишет:

ребята, простите меня - я пас на время... дорогого мне пса сегодня похоронил... сорри

Прими мои искренние соболезнования!

Я тебя понимаю. Сам хоронил домашнего питомца (волнистого попугайчика), который прожил в семье 15 лет.  Пока летал по квартире и помечал различные места, я не думал что буду переживать если он улетит. Но вот когда его не стало, все домашние сильно переживали,  и я в том числе. Он стервец хоть и раздражал каждое утро выходного дня своим свистом, но больше радовал, когда говоил "Давай покурим!" или "Тиша хорошая птичка". Хотели завести другого,  но матушка сказала "Не надо! Я второй раз такого не переживу."

Душу грело только то что он прожил у нас 15 лет, а не 10-12 лет как обычно. Значит ему не так плохо было у нас.

Еще раз прими мои искренние соболезнования.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я тебя понимаю. 

Выпью вечером за

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

Повторюсь сюда: экспериментально подтвердил, что стук начинается от дырок в степе каждые 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.

Письмо твое получил. И первый твой ответ нашел у себя в почте.

sadman41
Offline
Зарегистрирован: 19.10.2016

1) При неравномерности в 500мкс стук уже будет;
2) Паузы вполне может создавать сам GcodeSender, раз он командует двигаться сегментами (я правильно понимаю?)
3) Он у меня не запустился, а Java я обновлять не буду - она у меня для дела стоит старая.

Надо втыкать вывод куда-нить отладочных millis() или дергать ногой (смотреть потом на лог. анализаторе) когда сегмент кончился и когда начался по команде извне (или как там идет процесс).

sadman41
Offline
Зарегистрирован: 19.10.2016
По каналу Serial в логе вижу, что в момент стука ничего GSender не отправляет и не получает.
 
Поэтому решил проследить цепочку взаимоотношений функций и нашел еще такие метаморфозы:
 
loop() => (*) Serial_Report() => SET_input_data() => (**) process_input_data() => moveToPosition() => if (...) (*) Serial_Report() ; if(...) (**) process_input_data()
 
Т.е. я могу предположить, что в определенных случаях может вообще тупое зацикливание произойти.
 
Затем мой думатель закружился (чуть неонка не перегорела даже) в попытке пробежать по вероятным маршрутам алгоритма. Предлагаю для начала как-то линеаризовать процедуры, а потом уже пытаться найти потерянное время.
ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

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 кГЦ.

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-кода. Вот и все!

sadman41
Offline
Зарегистрирован: 19.10.2016

ALEGYR пишет:

Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по  таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!

Вы сами понимаете, что написали? Эксперт должен искать проблему в указанном дилетантом месте?

Т.е. если бы я пришел к вам и попросил починить невключающийся телевизор просто вспомнив как работает дежурка и взглядом эксперта найти неисправную МС, то вы бы прям сразу кинулись в ея паяльником тыкать?

sadman41
Offline
Зарегистрирован: 19.10.2016

ALEGYR пишет:

Вот и все!

Вобщем, я изложил свои соображения по поводу проблем потенциальной рекурсии, приводящей к хрен его знает каким задержкам.  

Если кто-то другой змеиным глазом в этой замене GOSUB-ов на вызовы функций сможет прям сразу указать точку приложения удара молотком - я немедля выпью за его психическое здоровье.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

 Предлагаю для начала как-то линеаризовать процедуры, а потом уже пытаться найти потерянное время.

Что такое "линеаризовать процедуры"?

Как я пониаю время теряется при выполнении строк 

 moveNSteps();// 

  while ( movementDone == false ){        // 
  
      if ( transfer_permission == true ){ // если разрешен запрос на новый G-код, то
      
          input_count_buf++ ;             // увеличиваем счетчик входного буфура, 
          transfer_permission = false ;   // сбрасываем флаг на разрешенние запроса нового G-кода программы
          ready();                        // посылаем запрос на новый G-код программы и  
        
      } 
          Serial_Report();                // 
  } 

Мне не совсем ясна работа оператора  while ( movementDone == false ){...} ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Как это - вам не совсем ясна? А кто является создателем сего опуса?

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

Вобщем, я изложил свои соображения по поводу проблем потенциальной рекурсии, приводящей к хрен его знает каким задержкам.  

Если кто-то другой змеиным глазом в этой замене GOSUB-ов на вызовы функций сможет прям сразу указать точку приложения удара молотком - я немедля выпью за его психическое здоровье.

Правильно ли я понимаю, что добровольный процесс экспертной оценки представленного кода закончен?

sadman41
Offline
Зарегистрирован: 19.10.2016

ALEGYR пишет:

Правильно ли я понимаю, что добровольный процесс экспертной оценки представленного кода закончен?

Собираетесь инициировать вариант с принудительными работами? ))

Искать проблему при дефектах в коде смысла не вижу - на моей памяти это ничем хорошим не кончалось. Да и вообще - я подошел сюда только потому, что меня интересовали вопросы возникновения стуков в моторе, так как периодически сталкиваюсь с такими задачами.

Код обещал пингвин посмотреть, а не я.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

Как это - вам не совсем ясна? А кто является создателем сего опуса?

О создателе сего опуса я писал на первой странице темы и предствалял исходник в своем сообщении с номером #23.

могу датьссылку на видео https://www.youtube.com/watch?v=fHAO7SW-SZI&feature=youtu.be

там есть ссылки на скетч и некоторую документацию по теории управления скоростью наговых двигателей.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В исходнике нет странных рекурсий, у вас - есть. 

Надо начинать все сначала писать. Такова жись. Или поставить уже GRBL на ардуинку.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

Собираетесь инициировать вариант с принудительными работами? ))

Я ничего инициировать не собираюсь! Я,  как железячник и новичек в ардуине,  своей просьбой 

ALEGYR пишет:

Объясните пожалуйста

1 - Откуда у этой метаморфозы ноги растут? 

2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?

просто хотел узнать у знатоков ардуины и чистых программистов природу метаморфоз, с которыми я столкнулся, и некоторые тонкости организации системы обработки прерываний ардуины меги

sadman41 пишет:

Искать проблему при дефектах в коде смысла не вижу - на моей памяти это ничем хорошим не кончалось. Да и вообще - я подошел сюда только потому, что меня интересовали вопросы возникновения стуков в моторе, так как периодически сталкиваюсь с такими задачами.

Очень жаль! У железячника и программиста была возможность решить общие проблемы.  

sadman41
Offline
Зарегистрирован: 19.10.2016

ALEGYR пишет:

просто хотел узнать у знатоков ардуины и чистых программистов природу метаморфоз, с которыми я столкнулся, и некоторые тонкости организации системы обработки прерываний ардуины меги

У чистых программистов, конечно, будет свое отдельное мнение, но лично я не вижу в прерывании, как таковом, никаких проблем. Грабли раскиданы вне системы обработки, как вы выразились.

ALEGYR пишет:

Очень жаль! У железячника и программиста была возможность решить общие проблемы.  

В данном случае у программиста нет никаких особых проблем. А уж с чего они вдруг стали общими - это очень интересный вопрос. Вроде как меня вы не наняли и сейчас не этап доводки станка по результатам опытной эксплуатации.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

<span style="line-height:1.5em;">sadman41 пишет:

У чистых программистов, конечно, будет свое отдельное мнение, 

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

</span><span style="line-height:1.5em;">sadman41 пишет:

но лично я не вижу в прерывании, как таковом, никаких проблем. Грабли раскиданы вне системы обработки, как вы выразились.

Это я тоже понял! Я только не понял зачем надо было просить логи c ЧУЖОГО анализатора и писать СВОЙ код для СВОЕГО железа, когда вопрос темы задавался для ЧУЖОГО конкретного кода и ЧУЖОГО конкретного железа?!

<span style="line-height:1.5em;">sadman41 пишет:

В данном случае у программиста нет никаких особых проблем.

Я вижу что у программиста нет никаких особых проблем. Он просто подошел сюда только потому, что его интересовали вопросы возникновения стуков в моторе, так как он периодически сталкивается с такими задачами.

<span style="line-height:1.5em;">sadman41 пишет:

А уж с чего они вдруг стали общими - это очень интересный вопрос. 

Так моторы-то стучат у обоих! Только у одного они стучат по причине якобы неравномерности последовательности импульсов STEP, а у другого они стучат только тогда, когда отрезок кривой перемещения разбивается на отдельные мелкие сегменты. Причем стучат только когда в коде нет врнменной задержки в 100-200 микросекунд, и НЕ стучат, когда задержка есть!

</span><span style="line-height:1.5em;">sadman41 пишет:

Вроде как меня вы не наняли и сейчас не этап доводки станка по результатам опытной эксплуатации.

Так я ничего и не требую! Я просто просил 

ALEGYR пишет:

Объясните пожалуйста

1 - Откуда у этой метаморфозы ноги растут? 

2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?

Хочешь и знаешь - отвечаешь! Не хочешь или НЕ знаешь - ничего и НЕ отвечаешь! Вот и все!!!

 

a5021
Offline
Зарегистрирован: 07.07.2013

ALEGYR пишет:
Это я уже понял на первой странице темы, когда мне хором стали объяснять как надо объявлять переменные

Если вы попробуете подсветить себе зажигалкой, чтобы посмотреть, сколько бензина осталось в баке, то окружающие вам так же наперебой начнут объяснять разное. Даже не потому, что они знают больше вас.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

sadman41 пишет:

ALEGYR пишет:

Так ничего и не надо устанавливать! Надо просто посмотреть исходник представленной программы, вспомнить систему обработки прерываний по  таймерам у ардуины меги, и взглядом эксперта найти косяк дилетанта. Я, как дилетант, его найти не могу!

Вы сами понимаете, что написали? Эксперт должен искать проблему в указанном дилетантом месте?

Конечно понимаю! Эксперт должен был искать проблему не в указанном дилетантом месте, а в представленном дилетантом тексте программы! 

sadman41 пишет:
Т.е. если бы я пришел к вам и попросил починить невключающийся телевизор просто вспомнив как работает дежурка и взглядом эксперта найти неисправную МС, то вы бы прям сразу кинулись в ея паяльником тыкать?

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

ALEGYR
Offline
Зарегистрирован: 20.09.2018

a5021 пишет:

Если вы попробуете подсветить себе зажигалкой, чтобы посмотреть, сколько бензина осталось в баке, то окружающие вам так же наперебой начнут объяснять разное. Даже не потому, что они знают больше вас.

Так бак-то был прозрачный! Да и не бензин в нем был, а вода!!!

a5021
Offline
Зарегистрирован: 07.07.2013

Если повезет, вы позже поймете, про какую "воду" вам говорили "хором". Ну а нет, так нет.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

А я уже понял, что тут предпочитают раскрашивать свои экранчики, и не любят раскрашивать чужие.  Писать свои этюды для начинающих, и не любят читать этюды самих начинающих. В своих-то задачках ответы всегда совпрадут,  а вот на чужих можно и облажаться!

a5021
Offline
Зарегистрирован: 07.07.2013

Я правильно понимаю, что вы крайне неудовлетворены темпами решения ваших проблем обитателями здешнего форума ?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ALEGYR пишет:

А я уже понял, что тут предпочитают раскрашивать свои экранчики, и не любят раскрашивать чужие.  Писать свои этюды для начинающих, и не любят читать этюды самих начинающих. В своих-то задачках ответы всегда совпрадут,  а вот на чужих можно и облажаться!

Читаю тему и не могу понять: Вы ещё до сих пор не поняли местных обитателей?!? Два года взад сам был таким .. дошло быстрей, однако. Стоит тут вклиниться - как сразу набегут ветеринары .. поэтому уже с тех пор и НЕ советую никому и ничего..

Лично мне хватило того что, библиотекой arhat.h пользовались те, кто её (и меня заодно) же тут и обсирает до сих пор, хотя писана она была исключительно как "вспомнить язык после 17-и летнего перерыва" .. так "на пробу".

Хотите реальную помощь - ищите иное место.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

a5021 пишет:

Я правильно понимаю, что вы крайне неудовлетворены темпами решения ваших проблем обитателями здешнего форума ?

Нет не правильно! Ведь я не ставил условий по решению своих проблем, и тему открыл не в разделе ищу исполнителя,  а в разделе  в котором обсуждаются вопросы программирования ардуины. Я надеялся получить от специалистов ответы на свои вопросы, но пока я их не получил. Я понимаю, что у специалистов есть более выжные дела, и они сюда не очень часто заходят,  но надеюсь у кого-то появится хорошее настроение  и они мне объяснят

ALEGYR пишет:

1 - Откуда у этой метаморфозы ноги растут? 

2 - Почему увеличение времени работы подпрограммы обработки прерывания убирает обрывы во временной диаграмме?

или дадут ссылки на приличную литературу или сайты, где описаны особенности использования системы прерываний в среде проектирования электронных устройств, имеюшей название "ардуино".

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Извини, полноценно вникать еще не готов. Но тут повторю:

1.НИКАКИХ ПРОБЛЕММ нет в прерывании. Задержка влияет чисто случайно. Ошибка в остальном коде. Про скрытую рекурсию тебе уже написали. Там еще очень много говна... его раскапывать нужно, мне пока некогда.

2. Книга про "ситему прерываний" это даташит ссылку я давал, там все очень подробно и с примерами на С и асме. Ну не может же тебе мешать то, что он на аглицком??!! Возможно где-то что-то есть на русском...  вообще не интересовался, но тут были люди, которые искали.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

Arhat109-2 пишет:

Читаю тему и не могу понять: Вы ещё до сих пор не поняли местных обитателей?!? 

Хотите реальную помощь - ищите иное место.

У меня уже давно нет никаких иллюзий в том что сегодня из себя представляет нынешний интернет и его профильные форумы. Просто, варясь в собственном соку начинает замыливаться глаз, и понимаешь что можно послушать и совет "дурачка"!

ALEGYR
Offline
Зарегистрирован: 20.09.2018

wdrakula пишет:

Извини, полноценно вникать еще не готов. Но тут повторю:

1.НИКАКИХ ПРОБЛЕММ нет в прерывании. Задержка влияет чисто случайно. Ошибка в остальном коде. Про скрытую рекурсию тебе уже написали. Там еще очень много говна... его раскапывать нужно, мне пока некогда.

Ничего, я подожду!

wdrakula пишет:

2. Книга про "ситему прерываний" это даташит ссылку я давал, там все очень подробно и с примерами на С и асме. 

Книгу про "систему прерываний" на которую  ты мне дал ссылку это даташит на семейство микроконтролеров ATmega640/V-1280/V-1281/V-2560/V-2561/V , а ардуино это не микроконтролер, а 

 

Цитата:
 инструмент для проектирования электронных устройств (электронный конструктор) более плотно взаимодействующих с окружающей физической средой, чем стандартные персональные компьютеры, которые фактически не выходят за рамки виртуальности. 

см http://arduino.ru/About

и

 

Цитата:
 платформа, предназначенная для «physical computing» с открытым программным кодом, построенная на простой печатной плате с современной средой для написания программного обеспечения.

см http://arduino.ru/About

wdrakula пишет:
Ну не может же тебе мешать то, что он на аглицком??!! Возможно где-то что-то есть на русском...  вообще не интересовался, но тут были люди, которые искали.

Мне аглицкий уже с 1995 года не мешает! Мне больше мешают активные интернетовские доброжелатели, оперирующие в своих объяснениях общими фразами, и ссылками на свою постоянную занятость!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ALEGYR пишет:
ссылками на свою постоянную занятость!

Спасибо тебе. Очень желаю, чтобы у тебя тоже умер близкий друг.

Все-таки редкая ты мразь!

sadman41
Offline
Зарегистрирован: 19.10.2016

Хотел объяснить по-человечески, но после "послушать дурачков" и отказа вникать в даташит к МК (систему прерываний которого сам же требовал вспомнить для поиска проблемы там, где ее нет), мотивируя тем, что "ардуино это не микроконтролер", считаю, что надо просто сливать воду.

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

Знакомо мне это всё - сервис-мануала нет, сонька не отвечает, потому что аппарат не на гарантии - досвидос, клиент, ваша мясорубка неремонтопригодна. А как самому что понадобилось - так все стелиться должны и искать в безумном коде ошибки, да еще и объяснять их.

ALEGYR
Offline
Зарегистрирован: 20.09.2018

wdrakula пишет:

Спасибо тебе. Очень желаю, чтобы у тебя тоже умер близкий друг.

Все-таки редкая ты мразь!

Зря ты так! Ведь я же написал, что понимаю твое состояние,  подожду когда у тебя все уляжется!

А фраза про то что мне мешает в интернетовском общении это просто ответ на твой вопрос про английский язык.