Arduino глючит

Evgen
Evgen аватар
Offline
Зарегистрирован: 10.06.2011

Привет всем!

Столкнулся с проблемой при программировании цикла в 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 или вообще из него не выходит. Гуру подскажите из-за чего это может быть?

 

Modular
Offline
Зарегистрирован: 05.03.2011

 На самом деле цикл у тебя не должен 50 раз выполняться у тебя приращение идет по два в строке 18, т.е. максимум 24, т.к. начинаешь ты с 1, а не 0.

Вижу потенциальную проблему в строчке 23 и 25. Смотри если у тебя i= 49, то в 23ей строке f будет 50, а в 25ой строке ты будешь пытаться присвоить imp[50] = ... А у тебя весь массив 50 элементов, значит последний 49ый, т.к. нумерация с 0. А запись в несуществующий элемент массива приводит к неожиданным результатам.

И вообще как-то весь код немного странно написан. Например, в 26 строке для принудительного выхода из цикла лучше использовать break

Evgen
Evgen аватар
Offline
Зарегистрирован: 10.06.2011

Modular тебе спасибо! Подсказал и теперь все работает.

Modular пишет:

 И вообще как-то весь код немного странно написан. Например, в 26 строке для принудительного выхода из цикла лучше использовать break

:)) Это понятно, что код странно написан, т.к. я только начинаю Ардуино осваивать. И поэтому следующий вопрос. Сначала пытался написать эту же программу через функцию PulseIn(), но она ожидает появление сигнала максимум 1 секунду. Timeout выставлял больше 10 миллионов (что бы 10 сек сигнал ждать), а она все равно 1 секунду максимум ждет. Это так и должно или я опять что то упустил?