Вопрос чисто по программированию! Компилятор ведет себя странно! БЕЗ 100 граммов не разобраться

emildesign
Offline
Зарегистрирован: 20.02.2017

Подключаю шаговик к ардуино:

Все работает, мотор крутится - все логично!
Меняю на 39 строчке знак на "минус" - мотор крутится в обратную сторону - все логично!
Изменю код, подключаю второй мотор - оба крутятся - все логично!
 
int pins2[] = {4, 5, 6, 7}; //Задаем пины по порядку
int pins[] = {8, 9, 10, 11}; //Задаем пины по порядку
 
Тут начинается самое интересное, меняю s=-1; все остальное не трогаю - первый мотор крутится обратно, второй нормально, меняю s=1, а s2=-1 первый крутится, второй стоит, ставлю в оба минус -1 - не один не крутиться. 
 
Причем в случае s=1, s2=-1 (первый крутится, второй стоит) меняю эти две строчки местами, т.е.
int s2=-1;
int s=1;
второй мотор крутится в обратку!!!!!! и первый крутится. 

Помоги понять в чем прикол? Как так, из-за того что объявление переменных помено местами - программа ведет себя по разному!

Немного код переделал, уже не понимая из-за чего такая фигня происходит, написал вместо += полную версию оператора, step_ поменл на переменную s.

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

вы бы вставили коды по правилам форума (вверху в редакторе значек соответствующий)

emildesign
Offline
Зарегистрирован: 20.02.2017
// Контакты   Bl Pi Ye  Or
int pins[] = {8, 9, 10, 11}; //Задаем пины по порядку

int phases = 8; // для шагового режима установить 4

// Для шагового режима
//bool motorPhases[4][4] = { // [phase][pin]
//// -------- pins ----------
//// Winding    A  B  A  B
//// Motor Pin  1  2  3  4
//// Color      Bl Pi Ye Or
//  {           1, 1, 0, 0},
//  {           0, 1, 1, 0},
//  {           0, 0, 1, 1},
//  {           1, 0, 0, 1}
//};

// Для полушагового режима
bool motorPhases[8][4] = { // [phase][pin]
  // -------- pins ----------
  // Winding    A  B  A  B
  // Motor Pin  1  2  3  4
  // Color      Bl Pi Ye Or
  {             1, 1, 0, 0},
  {             0, 1, 0, 0},
  {             0, 1, 1, 0},
  {             0, 0, 1, 0},
  {             0, 0, 1, 1},
  {             0, 0, 0, 1},
  {             1, 0, 0, 1},
  {             1, 0, 0, 0}
};

void setup() {
  for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT);
}

int phase = 0;
int _step = 1; // Если у шага поменять знак, на -1 - изменится направление вращения.

void loop() {
  phase += _step;
  if (phase > 7) phase = 0;
  if (phase < 0) phase = 7;

  for (int i = 0; i < 4; i++) {
    digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW));
  }
  // Пауза на вращение на один шаг/полушаг
  delay(2); // Для шагового режима установить в 3
}

 

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

emildesign пишет:

БЕЗ 100 граммов не разобраться

А проблема-то в чём? Вы несовершеннолентий? Или магазин уже закрылся?

emildesign
Offline
Зарегистрирован: 20.02.2017
Все работает, мотор крутится - все логично!
Меняю на 39 строчке знак на "минус" - мотор крутится в обратную сторону - все логично!
Изменю код, подключаю второй мотор - оба крутятся - все логично! Добавленные строки выделил.
// Контакты   Bl Pi Ye  Or
int pins2[] = {4, 5, 6, 7}; //Задаем пины по порядку
int pins[] = {8, 9, 10, 11}; //Задаем пины по порядку

int phases = 8; // для шагового режима установить 4

// Для полушагового режима
bool motorPhases[8][4] = { // [phase][pin]
  // -------- pins ----------
  // Winding    A  B  A  B
  // Motor Pin  1  2  3  4
  // Color      Bl Pi Ye Or
  {             1, 1, 0, 0},
  {             0, 1, 0, 0},
  {             0, 1, 1, 0},
  {             0, 0, 1, 0},
  {             0, 0, 1, 1},
  {             0, 0, 0, 1},
  {             1, 0, 0, 1},
  {             1, 0, 0, 0}
};

void setup() {
  for (int i = 0; i < 4; i++) { 
    pinMode(pins[i], OUTPUT);
    pinMode(pins2[i], OUTPUT);
  }

}

int phase = 0;
int phase2 = 0;
int s = 1; // Если у шага поменять знак, на -1 - изменится направление вращения.
int s2 = 1; // Если у шага поменять знак, на -1 - изменится направление вращения.
void loop() {
  phase += s;
  if (phase > 7) phase = 0;
  if (phase < 0) phase = 7;
  
  phase2 += s2;
  if (phase2 > 7) phase2 = 0;
  if (phase2 < 0) phase2 = 7;

  for (int i = 0; i < 4; i++) {
    digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW));
    digitalWrite(pins2[i], ((motorPhases[phase2][i] == 1) ? HIGH : LOW));
    
  }
  // Пауза на вращение на один шаг/полушаг
  delay(2); // Для шагового режима установить в 3
}

 

 

emildesign
Offline
Зарегистрирован: 20.02.2017

Тут начинается самое интересное, меняю s=-1; все остальное не трогаю - первый мотор крутится обратно, второй нормально, меняю s=1, а s2=-1 первый крутится, второй стоит, ставлю в оба -1 - не один не крутится. 

Причем в случае s=1, s2=-1 (первый крутится, второй стоит) меняю эти две строчки местами, т.е.
int s2=-1;
int s=1;
второй мотор крутится в обратку!!!!!! и первый крутится. 

Помоги понять в чем прикол? Как так, из-за того что объявление переменных поменяно местами - программа ведет себя по разному!

Если изменить код в коде += на -= тоже все работает.

int phase = 0;
int phase2 = 0;
int s = 1; // Если у шага поменять знак, на -1 - изменится направление вращения.
int s2 = 1; // Если у шага поменять знак, на -1 - изменится направление вращения.
void loop() {
  phase -= s;
  if (phase > 7) phase = 0;
  if (phase < 0) phase = 7;
  
  phase2 -= s2;
  if (phase2 > 7) phase2 = 0;
  if (phase2 < 0) phase2 = 7;

 

 

emildesign
Offline
Зарегистрирован: 20.02.2017

Совершеннолетний, магазин закрылся))) Но вопрос не в 100 граммах, а то, что это не лезет в обычную логику программирования. 

emildesign
Offline
Зарегистрирован: 20.02.2017

исправился - код по правилам в комментах)

__Alexander
Offline
Зарегистрирован: 24.10.2012

Это ардуино, и воможно int беззнаковое и никто не знает что такое <0, поставь четко signed int

emildesign
Offline
Зарегистрирован: 20.02.2017

__Alexander пишет:

Это ардуино, и воможно int беззнаковое и никто не знает что такое <0, поставь четко signed int

не помогло

emildesign
Offline
Зарегистрирован: 20.02.2017

__Alexander пишет:

Это ардуино, и воможно int беззнаковое и никто не знает что такое <0, поставь четко signed int

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

Logik
Offline
Зарегистрирован: 05.08.2014

Принял 100гр, всеравно не понял, добавил контрольных еще аналогичное кол-во. Ясности не добавилось. Вывод - 100гр не помогают, надо разбиратся.

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

Logik пишет:

100гр не помогают

Это уже серьёзно!

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

emildesign пишет:

__Alexander пишет:

Это ардуино, и воможно int беззнаковое и никто не знает что такое <0, поставь четко signed int

не помогло

...и я пошёл попил поел - не полегчало... )))

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

Странные вы какие-то...

Я вот пообедал - и вполне доволен собой. 

Чего и вам желаю.

nik182
Offline
Зарегистрирован: 04.05.2015

Прочитал все посты темы и не понял при чём здесь компилятор? В чем его странность? Компилирует, ошибок не выдает. 100 грамм не просит.  Просто чисто интересно, а если присвоение начального значения из объявления вынести в setup что будет?

ZIA
ZIA аватар
Offline
Зарегистрирован: 04.02.2017

Я склоняюсь, что на этом форуме собрались одни любители бахуса!?

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

ZIA пишет:

на этом форуме собрались одни любители бахуса!?

Почему одни любители? Есть и профессионалы, жрецы можно сказать.

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

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

ZIA пишет:

на этом форуме собрались одни любители бахуса!?

Почему одни любители? Есть и профессионалы, жрецы можно сказать.

Откройте секрет, кто это ???

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

wdrakula, конечно! Почитайте какой любовью проникнуты его посты про самогон!

Logik
Offline
Зарегистрирован: 05.08.2014

ua6em пишет:

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

ZIA пишет:

на этом форуме собрались одни любители бахуса!?

Почему одни любители? Есть и профессионалы, жрецы можно сказать.

Откройте секрет, кто это ???

Так и тема ж есть соответствующая ;) http://arduino.ru/forum/otvlechennye-temy/v-pomoshch-samogonshchiku