Прерывание. Как заставить моргать диод?

Lapiduss
Offline
Зарегистрирован: 18.04.2015
int led = 13;
char input;

void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop() {
if (Serial.available()>0){
input = Serial.read();
if (input == 'a')
{
digitalWrite(led, LOW);
}

if (input == 'b')
{
digitalWrite(led, HIGH);
}

If (input == 'c') {*вот здесь необходим мешающий диод*}
}
}

 

 

Проблема в том, что диод должен моргать, но сама ардуино при этом продолжать принимать данные с порта. Как быть?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, "с" останавливает и запускает мигание:

int led = 13;
char input;
boolean mig;
void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()>0){
    input = Serial.read();
    if (input == 'a') {digitalWrite(led, LOW);}
    if (input == 'b'){digitalWrite(led, HIGH);}
    if (input == 'c') {mig=~mig;}
    }
 if(mig){int n = millis()%1000; 
    digitalWrite(led, !(n-n%500)); 
    }
}

 

Lapiduss
Offline
Зарегистрирован: 18.04.2015

Однако, мигание не прирывается...  

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, изъясняйтесь конкретнее, что должно было ещё прерывать мигание? Символ "с" прерывает.

Lapiduss
Offline
Зарегистрирован: 18.04.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, а символ "с" разве не отключает?

Lapiduss
Offline
Зарегистрирован: 18.04.2015

В том-то и беда, что нет..

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, сочувствую. Залил скетч, что я дал в сообщении #1, у меня символ "c" и включает и отключает, всё чётко.   Значит что-то у вас не так.

Lapiduss
Offline
Зарегистрирован: 18.04.2015

Работает включение/выключение диода.(LOW/HIGH)

А вот такая тема 
 

 if (input == 'c') {mig=~mig;}
15
    }
16
 if(mig){int n = millis()%1000;
17
    digitalWrite(led, !(n-n%500));
18
    }

не робит :(

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, фантастиш. Попробуйте в 3 строке  (скетча в сообщение#1) boolean mig=0;

Lapiduss
Offline
Зарегистрирован: 18.04.2015

Безрезультатно. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, так мигать начинает даже без отправки "с" ? Или всё таки после нажатия ? И повторной остыкой "с" не останавливает?

Lapiduss
Offline
Зарегистрирован: 18.04.2015

Мигать начинает, но не останавливает.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, попробуйте поменять 14 строку  на if (input == 'c') {mig? mig=0 : mig=1 ;}

Lapiduss
Offline
Зарегистрирован: 18.04.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Lapiduss, А мне интересно, почему у вас не работала команда инверсии mig=~mig. Я не спец по СИ, и всегда пользуюсь этим приёмом, и всегда это работает.  Какая у вас версия программы ARDUINO IDE ? По поводу вашего вопроса посмотрите тут , параграф Оператор ?

ps: а попробуйте ещё как было, только вместо ~ это ! , т.е. mig=!mig;

 

 

.

X-Dron
Offline
Зарегистрирован: 24.01.2015

Меня больше удивляет, почему она не мигает с самого начала :)
mig=~mig; может не работать как надо, потому что в начале не инициализировано.
boolean mig;
И там может находится мусор. операция "~" делает побитовую инверсию всех 8-ми битов, отведенных под тип boolean.
если содержимое ячейки памяти под  mig содержит 00000001 (mig = 1), то  ~mig будет содержать 11111110, что тоже логическая 1.

Для boolean переменных правильнее делать так:
Инициализировать
boolean mig = false;
Инвертировать
mig=!mig;

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

X-Dron, согласен. "!" больше подходит для работы с булами, но ~ тоже обязана работать, мы же её инитили нолём. Всё таки в чем-же причина.. Мне любопытно, но найти причину нет возможности, у меня то всё работает )

X-Dron
Offline
Зарегистрирован: 24.01.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

X-Dron, не, точно не в этом дело в #9 добавляли =0, не помогло.

Lapiduss
Offline
Зарегистрирован: 18.04.2015

dimax пишет:

Lapiduss, А мне интересно, почему у вас не работала команда инверсии mig=~mig. Я не спец по СИ, и всегда пользуюсь этим приёмом, и всегда это работает.  Какая у вас версия программы ARDUINO IDE ? По поводу вашего вопроса посмотрите тут , параграф Оператор ?

ps: а попробуйте ещё как было, только вместо ~ это ! , т.е. mig=!mig;

 

 

.


arduino ide 1.6.1
При замене ~ на !, в первом предложенном вами варианте - всё начинает работать должным образом :)