Объясните на пальцах по условию if где туплю ((

Land
Offline
Зарегистрирован: 24.02.2022
Есть такой кусок кода:

ISR(TIMER1_COMPA_vect){
  digitalWrite(STEP_PIN, !digitalRead(STEP_PIN));
  digitalWrite(Mode1, !digitalRead(Mode1));
  STEP=++STEP;
  if (STEP > TARGET_STEP){
  STEP=0; Serial.println("REVERSE"); digitalWrite(DIR_PIN,!digitalRead(DIR_PIN));
  digitalWrite(Mode3,!digitalRead(Mode3));
  } else;  
  }

Собственно по прерыванию таймера инвертируем ногу STEP шагового драйвера. Одновременно считаю количество шагов ++STEP. Затем по условию if хочу сравнить это количество с целевым и при превышении изменить состояние ноги DIR -- изменить направление вращения и сбросить STEP в ноль.

Но в результате имею постоянное изменение направления вращения. Шаг туда, шаг обратно.

Второй день туплю, не понимаю, что делаю неправильно.

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

строка 06 очень интересна ))

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

rkit
Offline
Зарегистрирован: 23.11.2016

Land пишет:


  STEP=++STEP;

Что это такое?

Land
Offline
Зарегистрирован: 24.02.2022

Инкремент счетчика шагов.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Код нужно выкладывать полностью. По куску ничерта не поймёшь.

А вот это

Land пишет:

  STEP=++STEP;

Бред сивой кобылы.

Land пишет:

Инкремент счетчика шагов.

Нет, это именно бред сивой кобылы, а не инкремент счётчика. Инкремент пишется вот так:

STEP++;
Land
Offline
Зарегистрирован: 24.02.2022

v258 пишет:

строка 06 очень интересна ))

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

TARGET_STEP объявляется раньше, =400.

Мне собственно надо понять, в таком варианте оно работает или я тупо не понимаю, как if работает. За мысль по поводу частоты прерываний спасибо, надо найти сколько тактов на шаг для драйвера TMC2208 нужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вам

Land пишет:

собственно надо понять

что
ЕвгенийП пишет:

Код нужно выкладывать полностью

И пока Вы этого не поймёте, дело не сдвинется.

Land
Offline
Зарегистрирован: 24.02.2022

ЕвгенийП пишет:

Нет, это именно бред сивой кобылы, а не инкремент счётчика. Инкремент пишется вот так:

STEP++;

Вполне возможно, что и бред. Но у меня только так работает увеличение STEP

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Land пишет:

ЕвгенийП пишет:

Нет, это именно бред сивой кобылы, а не инкремент счётчика. Инкремент пишется вот так:

STEP++;

Вполне возможно, что и бред. Но у меня только так работает увеличение STEP

видимо компилятор бред выкидывает )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Land пишет:

Вполне возможно, что и бред. Но у меня только так работает увеличение STEP

Вы задаёте вопросы, чтобы учиться? Или чтобы поспорить? Скажите прямо и я просто перестану Вам что-либо писать. Мне эти посты нах не нужны. Вам, если учиться не хотите - тоже. Тогда зачем?

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

Land пишет:

Вполне возможно, что и бред. Но у меня только так работает увеличение STEP

У тя канпилятор фальшивый. 

Land
Offline
Зарегистрирован: 24.02.2022

Разобрался, всем спасибо )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Land пишет:

Разобрался, всем спасибо )

А выложить решение для будущих поколений вопрошателей? Или тока под себя гребём?

b707
Offline
Зарегистрирован: 26.05.2017

Land пишет:

Разобрался, всем спасибо )

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

Инкремент-то заработал или так и оставил бредятину в коде?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Инкремент-то заработал или так и оставил бредятину в коде?

Так он и в таком бредовом виде работает. С чего ему не работать? Бред бредом, но инкрементит.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Для надежности выполнения и читаемости лучше еще так: step=step++ ;-)

А то вариант ТСа компилятор может спутать со: step+=step, а это уже ой ))

 

Land
Offline
Зарегистрирован: 24.02.2022

b707 пишет:

Land пишет:

Разобрался, всем спасибо )

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

Инкремент-то заработал или так и оставил бредятину в коде?

Оставил конечно, мне ж надо чтоб работало.

Land
Offline
Зарегистрирован: 24.02.2022

ЕвгенийП пишет:

Land пишет:

Разобрался, всем спасибо )

А выложить решение для будущих поколений вопрошателей? Или тока под себя гребём?

драйвер в микрошаге работал. На один шаг надо было 16 раз тикнуть. 

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

Land пишет:

Оставил конечно, мне ж надо чтоб работало.

Компилятор лучше настоящий купи.  На этом сайте тебе любой старожил продаст, недорого, до $500.  +80 к IQ

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Land пишет:

b707 пишет:

Land пишет:

Разобрался, всем спасибо )

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

Инкремент-то заработал или так и оставил бредятину в коде?

Оставил конечно, мне ж надо чтоб работало.

Так а что древних записей боишься? Например, староязычное:  I = I+ 1; ? Опять что-то с религией канпилятура?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Rumata пишет:

Для надежности выполнения и читаемости лучше еще так: step=step++ ;-)

А то вариант ТСа компилятор может спутать со: step+=step, а это уже ой ))

а чё не step+=1; ? )))

SLKH
Offline
Зарегистрирован: 17.08.2015

BOOM пишет:

Так а что древних записей боишься? Например, староязычное:  I = I+ 1; ? Опять что-то с религией канпилятура?

  запись "i=i+1" однозначно читается, понятно всем и практически не оставляет возможностей для ошибки, поэтому тру-насильники его не применяют.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLKH пишет:
запись "i=i+1" однозначно читается, понятно всем ...

Тогда, может, вот так?

void setup(void) {
	Serial.begin(9600);
	Serial.println("Go on!");
}

void loop(void) {
	static uint16_t counter = 0;

	counter -= UINT16_MAX;

	Serial.println(counter);
	delay(500);
}
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Тогда, может, вот так?

троллите или просто пятница?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ua6em пишет:

а чё не step+=1; ? )))

А то, что это ущемляет права ТСа на использование "++" по своему усмотрению в любом месте программы. Не толерантно, короче

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Почему тролю? ТС же хочет, чтобы инкремент работал. Работает!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Почему тролю? ТС же хочет, чтобы инкремент работал. Работает!

если два обнулённых топора сходу в моём скетче такой приём не понял, а вы хотите от ТС )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЕвгенийП пишет:

Почему тролю? ТС же хочет, чтобы инкремент работал. Работает!

Хм, интригующе! А ещё извратнее, Евгений Петрович - ради пятницы, можно посмотреть?)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:
А ещё извратнее, Евгений Петрович - ради пятницы, можно посмотреть?)

Самый извращённый инкремент? Можно, только давайте уже не сегодня. Завтра подумаю. И Вы, кстати, подумайте, давайте поприкалываемся.

Сегодня уж башка пухнет, весь день одновременно были включены CNN и DW - перекрикивали друг друга, а параллельно читал в сети прессу других стран через гугловский перевод, ну и за нашей и украинской тоже краем глаза следил. Да ещё тут Йокерит с турнира снялся. Уже не могу.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЕвгенийП пишет:

BOOM пишет:
А ещё извратнее, Евгений Петрович - ради пятницы, можно посмотреть?)

Самый извращённый инкремент? Можно, только давайте уже не сегодня. Завтра подумаю. И Вы, кстати, подумайте, давайте поприкалываемся.

Я на такие придумки не сильно способен, но подумаю. Только не с утра - утром к детям, ремонт млин...

ЕвгенийП пишет:

Сегодня уж башка пухнет, весь день одновременно были включены CNN и DW - перекрикивали друг друга, а параллельно читал в сети прессу других стран через гугловский перевод, ну и за нашей и украинской тоже краем глаза следил. Да ещё тут Йокерит с турнира снялся. Уже не могу.

Ну я тоже иногда слежу, но стараюсь на тематическом форуме "опускать" это.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BOOM пишет:

ЕвгенийП пишет:

Почему тролю? ТС же хочет, чтобы инкремент работал. Работает!

Хм, интригующе! А ещё извратнее, Евгений Петрович - ради пятницы, можно посмотреть?)

Не, ну тут надо определиться с условиями: сколько используем таймеров, используем ли PCINT или ограничиваемся обычными прерываниями, допустимо ли, скажем, использовать DMA, если мы пишем для STM... опять же, ограничиваться одним кристаллом или допускается использовать периферию типа датчиков температуры, удара или распознавания голоса...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:
Не, ну тут надо определиться с условиями: сколько используем таймеров ...

Моя идея - исходить из минимализма - только средствами языка, без дополнительных аппаратных фокусов.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я пошел по "лайтовому" (для меня, по крайней мере) способу:

uint8_t num = B11111111, i = 1;

void setup(void) {
  Serial.begin(9600);
  Serial.println("Go on!");
}

void loop(void) {
  static uint16_t counter = 0;

  counter += bitRead(num, i++);

  if (i == 8) {
    i = 1;
  }
  Serial.println(counter);
  delay(500);
}

Строки 13-15 можно еще сократить, пока не соображу как "по красивее" )))

Я так думаю, что если этот код переписать на пока мне не всегда понятные инструкции со сдвигами битов и тп, то (наверное) еще "красивее" будет. Могу ошибаться.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Делать на i битовую операцию И чтоб оставлять только младшие три бита.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А я как раз редактировал по этому поводу свой пост. Но (как выше написал) пока не силен в этом. (

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

В чем? В битовых операциях? ЕвгенийП выложил сегодня в песочнице книжку, там в самом начале двоичная система очень просто описана
i &= 0x07;

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

BOOM пишет:
Строки 13-15 можно еще сократить, пока не соображу как "по красивее" )))

uint8_t num = B11111111, i = 1;

void setup(void) {
	Serial.begin(9600);
	Serial.println("Go on!");
}

void loop(void) {
	static uint16_t counter = 0;

	for (uint8_t mask = 0x80; mask > 0; mask >>= 1) counter += ((num & mask) > 0);

	Serial.println(counter);
	delay(500);
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DetSimen пишет:

BOOM пишет:
Строки 13-15 можно еще сократить, пока не соображу как "по красивее" )))

uint8_t num = B11111111, i = 1;

void setup(void) {
	Serial.begin(9600);
	Serial.println("Go on!");
}

void loop(void) {
	static uint16_t counter = 0;

	for (uint8_t mask = 0x80; mask > 0; mask >>= 1) counter += ((num & mask) > 0);

	Serial.println(counter);
	delay(500);
}

Деда перестарался ))) Там на выхлопе - 8, 16 ,24 ,32 и тд )))

Наверное без For должно быть? Ща попробую.

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

наскока я понимаю, counter - щёччик единичных битов в числе?  Я всю тему не читал, просто

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DetSimen пишет:

BOOM пишет:
Строки 13-15 можно еще сократить, пока не соображу как "по красивее" )))

////

Деда, вот так отлично работает!

uint8_t num = B11111111, mask = 0x80;;

void setup(void) {
  Serial.begin(9600);
  Serial.println("Go on!");
}

void loop(void) {
  static uint16_t counter = 0;

  mask >>= 1;
  counter += ((num & mask) > 0);

  if (mask > 0) {
    mask = 0x80;
  }

  Serial.println(counter);
  delay(500);
}

 

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

BOOM пишет:

Деда, вот так отлично работает!

uint8_t num = B11111111, mask = 0x80;;

void setup(void) {
  Serial.begin(9600);
  Serial.println("Go on!");
}

void loop(void) {
  static uint16_t counter = 0;

  mask >>= 1;
  counter += ((num & mask) > 0);

  if (mask > 0) {
    mask = 0x80;
  }

  Serial.println(counter);
  delay(500);
}

 

Нет.  Вдумайся в 

14   if (mask > 0) {
15     mask = 0x80;
16   }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

наскока я понимаю, counter - щёччик единичных битов в числе?  Я всю тему не читал, просто

Нет, это просто инкрементируемый счётчик. Увеличивается на 1 при каждом прохождении, т.е. задача, наиболее извращённо написать операцию ++counter

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

Аааа.  Тада, можно я в этом участвовать не буду?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DetSimen пишет:

Аааа.  Тада, можно я в этом участвовать не буду?

Уже низзя!! ))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DetSimen пишет:

BOOM пишет:

Деда, вот так отлично работает!

uint8_t num = B11111111, mask = 0x80;;

void setup(void) {
  Serial.begin(9600);
  Serial.println("Go on!");
}

void loop(void) {
  static uint16_t counter = 0;

  mask >>= 1;
  counter += ((num & mask) > 0);

  if (mask > 0) {
    mask = 0x80;
  }

  Serial.println(counter);
  delay(500);
}

 

Нет.  Вдумайся в 

Я тоже афигел, но проверил и работает! Первый (после Евгения Петровича) аццкий способ найден! )))

Ещё будя? )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:
(после Евгения Петровича)
Стоп, моего Вы ещё не видели. Я над ним только работаю. Но, сразу говорю, у меня гораздо скромнее по задумке :-)

Собсна, у меня две идеи. Одна уже готова, а над второй работаю. Первая - вот она:

void setup(void) {
	Serial.begin(9600);
	Serial.println("Go on!");
}

void loop(void) {
	static uint16_t counter = 0;

	counter += !! Serial.println(counter);
	delay(500);
}

Вторую выложу по мере готовности.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЕвгенийП пишет:

BOOM пишет:
(после Евгения Петровича)
Стоп, моего Вы ещё не видели. Я над ним только работаю. Но, сразу говорю, у меня гораздо скромнее по задумке :-)

Собсна, у меня две идеи. Одна уже готова, а над второй работаю. Первая - вот она:

void setup(void) {
	Serial.begin(9600);
	Serial.println("Go on!");
}

void loop(void) {
	static uint16_t counter = 0;

	counter += !! Serial.println(counter);
	delay(500);
}

Вторую выложу по мере готовности.

Евгений Петрович, интересное решение, но для использования без перефирии (так же получается?) сериал вроде как нельзя. Или можно? Ну только честно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:
сериал вроде как нельзя. Или можно? Ну только честно.
Не знаю, мне казалось, что можно - результат-то надо куда-то выводить, иначе как понять, что оно работает? Ну, нельзя так значит это решение "нещитова" :-(

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЕвгенийП пишет:

BOOM пишет:
сериал вроде как нельзя. Или можно? Ну только честно.
Не знаю, мне казалось, что можно - результат-то надо куда-то выводить, иначе как понять, что оно работает? Ну, нельзя так значит это решение "нещитова" :-(

Нещитова. Потому как "выводить" - это не =  "генерировать" (выводить можна и на дисплей, например).

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

BOOM пишет:

DetSimen пишет:

Аааа.  Тада, можно я в этом участвовать не буду?

Уже низзя!! ))

Деда слился? Без "разрешения"? ))

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

BOOM пишет:

Деда слился? Без "разрешения"? ))

Смысла в изращениях не вижу, я не настока владею этим вашим лживым С++