В данный момент на основе вашего кода(который ниже) пытаюсь сделать такое: при остановке- подождать немного и включить реверс.
В данный момент не особо получается. Почему-не могу пока понять.
Ваш код:
void setup()
{
pinMode (hallPin, INPUT);
Serial.begin(115200);
attachInterrupt(0, sensor_impulse, FALLING);
Motor_B (2, 1); //запуск двигателя в самом начале
} //setup
void loop()
{
detachInterrupt(0);
if (shaft_state && millis() - lasttime > SENSOR_MIN_TIME){shaft_state = 0;}
attachInterrupt(0, sensor_impulse, FALLING);
static bool lastshaft_state = 1;
if (lastshaft_state!=shaft_state)
{
if (shaft_state) Serial.println("Shaft start");
else Serial.println ("Shaft stop");
lastshaft_state=shaft_state;
}
}
Мой код, на базе вашего:
void setup()
{
pinMode (hallPin, INPUT);
Serial.begin(115200);
attachInterrupt(0, sensor_impulse, FALLING);
Motor_B (2, 1); //запуск двигателя в самом начале
} //setup
void loop()
{
detachInterrupt(0);
if (shaft_state && millis() - lasttime > SENSOR_MIN_TIME){shaft_state = 0;}
attachInterrupt(0, sensor_impulse, FALLING);
static bool lastshaft_state = 1;
if (lastshaft_state!=shaft_state)
{
if (shaft_state) Serial.println("Shaft start");
else
{
//вот такое изменение внес-----------------------------------------------------------------
Serial.println ("Shaft stop");
lastshaft_state=shaft_state;
Hard_stopper(3); //остановка двигателя
delay (3000);
Motor_B (2, 1); //запуск двигателя
//глючит-отрабатывает только 1 раз. Потом запускается и на удержание уже не //реагирует.....
//-----------------------------------------------------------------------------------------------------
}
}
}
Причем! Что удалось выяснить на данный момент:
если в вышеприведенном коде(который ваш, изначальный), я изменяю вот этот кусок:
if (shaft_state)Serial.println("Shaft start");
else Serial.println ("Shaft stop");
lastshaft_state=shaft_state;
вот на такой(чтобы отсылка шла в Serial и еще выполнялся мой код-сразу начинаются глюки...Можете пояснить, почему?
Вот это глючит (хотя по сути, это одно и то же что наверху):
if (shaft_state)
{
Serial.println("Shaft start");
//далее тут некий мой код
}
else
{
Serial.println ("Shaft stop");
lastshaft_state=shaft_state;
//далее тут некий мой код
}
Но есть вот какой вопрос...дело в том, что я сам специализируюсь по java. И поэтому довольно легко понимаю конструкции C++ - которые в ардуино...Но мне непонятна вот эта строчка:
volatile bool shaft_state = 1; (она в самом начале).
Разберем ее подробно....(т.к. именно некоторых моментов не нашел в сети):
Поправьте меня, если не прав:
volatile
Операции чтения/записи volatile переменной являются атомарными.
Результат операции записи значения в volatile переменную одним потоком, становится виден всем другим потокам, которые используют эту переменную для чтения из нее значения.
bool (в сети не нашел расшифровки) . Если это boolean -то почему пишем bool?
Далее...Почему, если это boolean, как он может быть равен 1? Он ведь логический: TRUE или FALSE? Ну я допускаю, что под "равен 1" подразумевается "TRUE", но сама запись мне не понятна...информацию не смог найти по этой теме...
И еще...вот по этой строчке:
volatile uint32_t lasttime = 0;
Почему мы пишем uint32_t ? Я нашел информацию по теме, что это:
uint32_t
32-битовый без знака
Но почему нам так писать? а не использовать какой то другой тип? (я не придираюсь, - для себя хочу понять...)
Но есть вот какой вопрос...дело в том, что я сам специализируюсь по java. И поэтому довольно легко понимаю конструкции C++ - которые в ардуино...Но мне непонятна вот эта строчка:
volatile bool shaft_state = 1; (она в самом начале).
Разберем ее подробно....(т.к. именно некоторых моментов не нашел в сети):
Поправьте меня, если не прав:
volatile
Операции чтения/записи volatile переменной являются атомарными.
Результат операции записи значения в volatile переменную одним потоком, становится виден всем другим потокам, которые используют эту переменную для чтения из нее значения.
bool (в сети не нашел расшифровки) . Если это boolean -то почему пишем bool?
Далее...Почему, если это boolean, как он может быть равен 1? Он ведь логический: TRUE или FALSE? Ну я допускаю, что под "равен 1" подразумевается "TRUE", но сама запись мне не понятна...информацию не смог найти по этой теме...
И еще...вот по этой строчке:
volatile uint32_t lasttime = 0;
Почему мы пишем uint32_t ? Я нашел информацию по теме, что это:
uint32_t
32-битовый без знака
Но почему нам так писать? а не использовать какой то другой тип? (я не придираюсь, - для себя хочу понять...)
volatile - компилятор не делает никаких оптимизаций, при использовании таких переменных, так как она может измениться в любой момент, в том числе и из другого места программы, например, в прерывании.
bool логический тип, ненастоящий, выведенный из int. По традиции, false это 0, true - всё, что не 0. bool и int взаимозаменяемы. Например
char ch;
.
if ( ch=='\0x00') - логическое условие
if (!ch) - то же самое, только ch берется как int. Оба условия для Си равнозначны
uint32_t = unsigned long что короче написать? И в этой записи ты сразу видишь размер переменной, не зависящий от компилятора
Всем доброго!
В данный момент на основе вашего кода(который ниже) пытаюсь сделать такое: при остановке- подождать немного и включить реверс.
В данный момент не особо получается. Почему-не могу пока понять.
Ваш код:
Мой код, на базе вашего:
Причем! Что удалось выяснить на данный момент:
если в вышеприведенном коде(который ваш, изначальный), я изменяю вот этот кусок:
вот на такой(чтобы отсылка шла в Serial и еще выполнялся мой код-сразу начинаются глюки...Можете пояснить, почему?
Вот это глючит (хотя по сути, это одно и то же что наверху):
Потому что эту строчку надо из else вынести lastshaft_state=shaft_state
в if (lastshaft_state!=shaft_state)
Все, спасибо-все получилось и работает! :-)
Но есть вот какой вопрос...дело в том, что я сам специализируюсь по java. И поэтому довольно легко понимаю конструкции C++ - которые в ардуино...Но мне непонятна вот эта строчка:
volatile bool shaft_state = 1; (она в самом начале).
Разберем ее подробно....(т.к. именно некоторых моментов не нашел в сети):
Поправьте меня, если не прав:
bool (в сети не нашел расшифровки) . Если это boolean -то почему пишем bool?
Далее...Почему, если это boolean, как он может быть равен 1? Он ведь логический: TRUE или FALSE? Ну я допускаю, что под "равен 1" подразумевается "TRUE", но сама запись мне не понятна...информацию не смог найти по этой теме...
И еще...вот по этой строчке:
volatile uint32_t lasttime = 0;
Почему мы пишем uint32_t ? Я нашел информацию по теме, что это:
Но почему нам так писать? а не использовать какой то другой тип? (я не придираюсь, - для себя хочу понять...)
Все, спасибо-все получилось и работает! :-)
Но есть вот какой вопрос...дело в том, что я сам специализируюсь по java. И поэтому довольно легко понимаю конструкции C++ - которые в ардуино...Но мне непонятна вот эта строчка:
volatile bool shaft_state = 1; (она в самом начале).
Разберем ее подробно....(т.к. именно некоторых моментов не нашел в сети):
Поправьте меня, если не прав:
bool (в сети не нашел расшифровки) . Если это boolean -то почему пишем bool?
Далее...Почему, если это boolean, как он может быть равен 1? Он ведь логический: TRUE или FALSE? Ну я допускаю, что под "равен 1" подразумевается "TRUE", но сама запись мне не понятна...информацию не смог найти по этой теме...
И еще...вот по этой строчке:
volatile uint32_t lasttime = 0;
Почему мы пишем uint32_t ? Я нашел информацию по теме, что это:
Но почему нам так писать? а не использовать какой то другой тип? (я не придираюсь, - для себя хочу понять...)
многие знания многие печали )))
volatile - компилятор не делает никаких оптимизаций, при использовании таких переменных, так как она может измениться в любой момент, в том числе и из другого места программы, например, в прерывании.
bool логический тип, ненастоящий, выведенный из int. По традиции, false это 0, true - всё, что не 0. bool и int взаимозаменяемы. Например
char ch;
.
if ( ch=='\0x00') - логическое условие
if (!ch) - то же самое, только ch берется как int. Оба условия для Си равнозначны
uint32_t = unsigned long что короче написать? И в этой записи ты сразу видишь размер переменной, не зависящий от компилятора