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 секунду максимум ждет. Это так и должно или я опять что то упустил?