Работа attachInterrupt
- Войдите на сайт для отправки комментариев
Ср, 18/04/2018 - 23:22
Здравствуйте подскажите можно ли вообще в данном коде реализовать сигналы после "case 45...360" длинной 10 секунд каждый? В этом коде получается, что delay вообще не работает, я так понимаю из-за attachInterrupt. Но всеже может можно как-то реализовать сигнал 10 секунд?
volatile boolean flag; volatile unsigned int val; void setup() { Serial.begin (115200); pinMode (2, INPUT_PULLUP); pinMode (3, INPUT_PULLUP); pinMode (13, OUTPUT); attachInterrupt (1, start, FALLING); val=0; } void loop() { if (flag) { encoder (); //delay (500); } } void start () { flag = 1; } void encoder () { attachInterrupt (0, scet, FALLING); } void scet () { if (val >= 0 && val <= 360){ val++; switch (val) { case 10: Serial.println ("Metka_2"); sig(); Serial.println ("RABOTA_2"); break; case 90: Serial.println ("Metka_3"); sig(); // тут надо сигнал 10 секунд break; case 135: Serial.println ("Metka_4"); sig(); // тут надо сигнал 10 секунд break; case 180: Serial.println ("Metka_1"); sig(); // тут надо сигнал 10 секунд break; case 225: Serial.println ("Metka_2"); sig(); // тут надо сигнал 10 секунд break; case 270: Serial.println ("Metka_3"); sig(); // тут надо сигнал 10 секунд break; case 315: Serial.println ("Metka_4"); sig(); // тут надо сигнал 10 секунд break; case 360: Serial.println ("Metka_1"); sig(); // тут надо сигнал 10 секунд Serial.println ("RABOTA_1"); break; } Serial.println(val); } else { val=0; scet (); } } void sig () { digitalWrite (13, HIGH); delay (10000); Serial.println ("10_sek"); digitalWrite (13, LOW); }
Сигнал 10 секунд (и даже больше) реализовать можно.
Но, разумеется, не следует пихать его внутрь прерывания.
Просто возмите за правило, что длительность прерывания не должна превышать нескольких долей миллисекунды. Все, что не укладывается в эти пределы, следует из прерывания выносить.
Возьмите за правило внутри функции обработчика прерывания не работают не delay ни millis. Сам обработчик scet должен быть как можно короче всмысле проделанной работы
Спасибо) А как правильно вынести ( куда писать код ).
P.S. Только сильно не пинайте!
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Учитесь на здоровье
Извиняйте не понял. Подождите объяснят
Спасибо за ссылку, но я имел ввиду свой код в #1 посте. как правильно написать сигнал в коде, что бы он небыл в прерывании?
Вот эта часть кода в обработчике не нужна
У вас много повторяющихся фрагментов и "лишнмх" условий
Думаю достаточно
Спасибо, но все же мне нужен сигнал 10 секунд при определенных значениях val. Как его сделать?
Посмотрите, attachInterrupt объявляется в setup. В мраке функций надо отыскать свет :) Да и #1
Расскажите подробно как вы хотите чтобы работал ваш код. Подозреваю что у вас 2 кнопки на пинах 2, 3 подтянуты к питанию. Сигнал 10 секунд можно вынести в отдельный блок и сделать с помощью millis
Да, Вы правы, у меня 2 кнопки - это имитация энкодера. Т.е. при нажатии кнопки на пине 3, дуина начинает считать импульсы с энкодера ( их 360 за оборот) по пину 2, а при достяжении углов 10, 90, 135, 180, 225, 270, 315 и 360 (0) должны быть сформированны сигналы каждый по 10 секунд, но счет энкодера не должен прекращаться.
То есть нажали одну и через время другую на 3 пине и процесс пошел? Сигнал - это загорелся на 10 секунд светодиод на 13 пине и затем по окончании счета потух верно?
Кнопка на пине 3 - старт отсчета импульсов с энкодера ( в данный момент у меня не энкодер а просто кнопка, как иммитация энкодера)
Кнопка на пине 2 - считывает импульсы с экодера ( в данный момент с кнопки)
При приходе (пример) 10-ого импульса - загорается 13 led pin на 10 секунд, но в это самое время счет продолжается, и при появлении 90-ого импулься 13 led pin снова загорается на 10 секунд. И так пока не перестанешь клацать на кнопку (т.е. пока энкодер не остановит свое вращение)
Ясно, сегодня я уже вам не помогу. Вам еще нужно доработать код чтобы все было на своих местах. И еще попробуйте вначале сделать проще проверить со значением val допустим 10 идет или не идет сигнал. Затем уже делайте отдельную функцию, case там правде лишний
В том-то и дело что сигнал идет на 13 пин, но длинна его зависит от времени между импульсами 10 и 11. Т.е. медленее нажимать на кнопку на 2 пине, то 13 пин горит дольше и наоборот)) Т.е. если поставить энкодер, то при его вращении длина импульса на 13 пине будет зависить от скорости вращения энкодера.
Vosara, спасибо огромное, код заработал как надо!
Можно короче и без delay.