Arduino глючит
- Войдите на сайт для отправки комментариев
Пт, 10/06/2011 - 16:20
Привет всем!
Столкнулся с проблемой при программировании цикла в arduino. Пишу программу которая засекает длительность импульсов:
unsigned long a = 0; unsigned long b = 0; word imp[50]; int f = 0; int i = 0; void setup(){ pinMode(7, INPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop(){ digitalWrite(13, HIGH); Serial.println("Wait signal"); while(digitalRead(7) == HIGH){} //ждем низкого уровня (7 пин подтянут к +5в) for(i=1; i <= 50 ; i=i+2){ //начало цикла который глючит a = micros(); //Засекаем во сколько сигнал появился while(digitalRead(7) == LOW){} //Пока сигнал есть стоим на этой строчке imp[i] = micros() - a; //Вычислили сколько времени был сигнал и записываем значение в массив imp b = micros(); //Засекаем время когда сигнал пропал f = i + 1; while(digitalRead(7) == HIGH){} //Ждем сигнал imp[f] = micros() - b; //Вычислили сколько времени небыло сигнала if (imp[f] > 25000 || imp[f] <= 0) { i = 200; } // Если сигнала небыло больше 25000 мкс то выходим из цикла } digitalWrite(13, 0); for( i=1; i<=f; i++){Serial.println(imp[i], DEC);} Serial.println("Signal OK !!!"); Serial.println(f, DEC); delay(1500); }
Цикл должен выполняться максимум 50 раз (или 25 если точно), а на самом деле он может выполниться 300 раз или, например, 258 или вообще из него не выходит. Гуру подскажите из-за чего это может быть?
На самом деле цикл у тебя не должен 50 раз выполняться у тебя приращение идет по два в строке 18, т.е. максимум 24, т.к. начинаешь ты с 1, а не 0.
Вижу потенциальную проблему в строчке 23 и 25. Смотри если у тебя i= 49, то в 23ей строке f будет 50, а в 25ой строке ты будешь пытаться присвоить imp[50] = ... А у тебя весь массив 50 элементов, значит последний 49ый, т.к. нумерация с 0. А запись в несуществующий элемент массива приводит к неожиданным результатам.
И вообще как-то весь код немного странно написан. Например, в 26 строке для принудительного выхода из цикла лучше использовать break;
Modular тебе спасибо! Подсказал и теперь все работает.
И вообще как-то весь код немного странно написан. Например, в 26 строке для принудительного выхода из цикла лучше использовать break;
:)) Это понятно, что код странно написан, т.к. я только начинаю Ардуино осваивать. И поэтому следующий вопрос. Сначала пытался написать эту же программу через функцию PulseIn(), но она ожидает появление сигнала максимум 1 секунду. Timeout выставлял больше 10 миллионов (что бы 10 сек сигнал ждать), а она все равно 1 секунду максимум ждет. Это так и должно или я опять что то упустил?