Зависает прерывание?
- Войдите на сайт для отправки комментариев
Сделал индикатор мощности в сети 220В.
Подключил arduino к счетчику, к выводам удаленного мониторинга, там похоже стоит опторозвязка.
Вобщем все работает, мощность показывает какое-то время, сутки или 3 часа, по разному.
Счетчик ненужный используется, поэтому там долгое время бывает не бывает нагрузки, при этом светодиод не моргает и в итоге при подключении нагрузки прерывания не срабатывают.
При этом перестает правильно реагировать на millis(), это только-что заметил, т.к. проект включает в себя управление курятником :) регулирует температуру, управляет освещением, и еще температуру дома и на улице показывает. Вобщем входы-выходы все использованы.
В обработчике прерывания никакних сложных действий не производится, один рас вызывается micros() и пара сравнений инкрементов переменных с ключевым словом volatile.
До этого эта-же ардуина с этой-же функцией исправно показывала скорость на машине, там датчик холла был завязан на кардан т.к. датчик на коробке автомате что-то заумирал и скорости не переключались.
Вобщем. мне надо какие-то мысли по поводу как победить это дело.
Если в нагрузку включена лампа 8Вт светодиодная, то он очень радко, раз в несколько минут помаргивает и и вроде как не зависает, а вот зарядник от телефона такого эффекта не дал - зависло за 3 часа.
Счас примеры кода не могу привести, т.к. все на другом компе. Сделан по такому принципу: int pin = 13;
int state = LOW;
unsigned long time;
unsigned long timenext=0;
unsigned long NewData;
unsigned long NewData2;
void setup()
{
Serial.begin(115200);
pinMode(pin, OUTPUT);
pinMode(2, INPUT);
attachInterrupt(0, reader, RISING);
}
void loop()
{
time=millis();
if (time>=timenext)
{
timenext=timenext+1000;
NewData2=NewData; // для отображения
NewData=0;
Serial.println(NewData2);
state=!state;
digitalWrite(pin, state);
}
}
void reader()
{
NewData++;
}
Только в функции reader измеряется интервал по отношению к предыдущему событию.
1. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
2. Не вижу слова volatile в приведённом скетче.
Ага, про code понял.
В двух словах если
при объявлении NewData написать volatile в loop вывести NewData на индикатор, то через какое-то время NewData престает изменяться, на вход импульс приходит исправно, если его считывать и выводить на экран в loop то видно.
Я вобще чайник и про voltile узнал позавчера. До этого боролся с "ложными" срабатываниями прерывания при помехе, которая возникала если где-то в сети 220 пощелкать выключателем к которому ничего не подключено, всякие конденсаторно-дроссельные фильтры на входе не помогли. Победил это считывая состояние порта в момент прерывания, ложных срабатываний не стало.
Дело в том что запасной ардуины пока нет и приходится экспериментировать по живому, т.к. куры несуться, а если утром свет не включать вовремя, а я любитель поспать до 11, то не несуться :)
Сегодня причешу код и выложу скетч.
Вешать что-либо на прерывание без хотя-бы простейшего эр-цэ фильтра крайне не рекомендуется......
Устанете дребезг обрабатывать.
Возьмите на вооружение правильную схему: http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki?page=2#comment-152876
Код, даже не буду оправдываться за стиль, все написано на коленке на ходу между делом. Много всякой экспериментально-отладочной каши.
Проблемное место с 320 строки.