Без делея не работает, что не так?

MelodyPon
Offline
Зарегистрирован: 20.10.2015

Есть код (первый проект на ардуинке, так сказать) и моя голова отказывается понимать что с ним не так...

const int c = 1; 
byte /*buttomValOld[128 * (c + 1)],*/ controlValOld[128 * (c + 1)], chanal, control;
int controlNum;
void setup() {
  Serial.begin(250000);
  controlNum = 0;
  for ( int controlNum = 0; controlNum  <= 128 * (c + 1); controlNum++)
  {
    controlValOld[controlNum] = 0;
  }
  pinMode (13, OUTPUT);
  pinMode (8, INPUT);
  chanal = 0;
  control = 0;


}

void loop() {
  for ( chanal = 0; chanal <= c; chanal = chanal + 1)
  {
    for ( control = 0; control <= 127; control = control + 1)
    {
      controlNum = (control + chanal * 128);

      //------------------------------------------------------------------------//

      { //работа с контроллерами
        //Условие выполнения для конкретного контроллера
        { if ((controlNum >= 1) and (controlNum <= 5))
          
            if ((analogRead(controlNum) / 8) == controlValOld[controlNum]) {}
            else
            {
              digitalWrite(13, HIGH);
              Serial.write(0xB0 + chanal); //Если убрать эту и..
              Serial.write(control);
              Serial.write(analogRead(controlNum) / 8); //..и эту - работает без делея
              digitalWrite(13, LOW);
              controlValOld[controlNum] = (analogRead(controlNum) / 8);
           //   delay(0); //Без него не работает О.о
            }
        }
      }
    }
  }

  // digitalWrite(13, HIGH);
 //   delay(0); // С этим то же самое
//   digitalWrite(13, LOW);
}

 

Если убрать делей - то светодиод на 13 ножке просто горит и всё, постоянно. Если поставить делей в этот цикл, либо в конец со значением 0 - то всё работает. Но всё таки он меня напрягает... Кстати, если напрочь убрать массив - тоже всё работает, но не так как нужно. Почему в его присутствие с нулевым значением всё работает, а без него - нет? И имеет ли реальную задержку команда delay(0)? 

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

unsigned long start;
unsigned long stop;
unsigned long time;

void setup() {
start = micros();
delay(0);
stop = micros();
time = stop - start;
}

void loop() {

// напечатай переменную time куда-нибудь что бы напосмотреть.

}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А так?

void setup() {
start = micros();
stop = micros();
time = stop - start;
}
Клапауций 911
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

А так?

это не ко мне - пусть ТС проводит опыты, что у него за чюдо-код такой, что на микросекунды реагирует: тут работаю - тут не работаю.

void setup() {
start = micros();
// delay(0);
// 
stop = micros();
time = stop - start;
}

*самому стало интересно, кварц 12 мегагерц - как-то так:

// delay(1); // 1020
// delay(0); // 20
// 5

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот и я об этом: самой micros() тоже нужно время - 4 мс на 16 МГц или 8 мс - на 8 МГц. Вполне логично, что на 12 МГц это будет 5 или 6 мс.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

Вот и я об этом: самой micros() тоже нужно время - 4 мс на 16 МГц или 8 мс - на 8 МГц. Вполне логично, что на 12 МГц это будет 5 или 6 мс.

да, но // delay(0); // 20

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, если вычесть 5, которые приходятся на micros(), остается 15 мкс. Ни какая функция не может отработать мгновенно.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

Ну, если вычесть 5, которые приходятся на micros(), остается 15 мкс. Ни какая функция не может отработать мгновенно.

ну, и?

MelodyPon пишет:
И имеет ли реальную задержку команда delay(0)? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MelodyPon пишет:

И имеет ли реальную задержку команда delay(0)? 

А что открыть код и посмотреть запрещённый у нас ИГИЛ мешает?

void delay(unsigned long ms)
{
	uint16_t start = (uint16_t)micros();

	while (ms > 0) {
		yield();
		if (((uint16_t)micros() - start) >= 1000) {
			ms--;
			start += 1000;
		}
	}
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

А что открыть код и посмотреть запрещённый у нас ИГИЛ мешает?

Это неспортивно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Типа, "не наш метод"? :))))