Close

Odpověď na: Arduino UNO – seknutí

Úvodní stránka Fórum Hardware Arduino Arduino UNO – seknutí Odpověď na: Arduino UNO – seknutí

#4460
Zbyšek Voda
Správce

Dobrý den,

když tak zběžně koukám na váš program, napadá mě jedna věc. Snad to bude ono.

Na začátku máte:

 
Timer1.initialize(100);
Timer1.attachInterrupt(timerIsr);

což zapříčiní, že se bude funkce timerIsr volat každých 100µs.

Funci timerIsr máte definovanou jako


void timerIsr() {
  if(actual_speed == 0) return;
  tick_count++;
  if(tick_count == ticks) {  
    // make a step
    digitalWrite(PIN_STEP, HIGH);
    digitalWrite(PIN_STEP, LOW);
    tick_count = 0;
  }
}

čili každých 100µs se proměnná tick_count zvýší o jednu (pokud neplatí speciální podmínky – ty teď ale přeskočme). Proměnná tick_count je typu int.


int tick_count;

a to by mohl být ten problém. Proměnné typu int mohou uchovávat čísla od -32.768 do 32.767. Vy ale nemáte nijak pojištěno, co se stane, když vám tick_count přeteče.

Jako první krok zkuste použít jiný typ – například unsigned long, který může mít rozsah od 0 do 4.294.967.295.


unsigned long tick_count;

Pokud se problém vyřeší (respektive se o hodně odloží), budeme mít jistotu, že to byl skutečně problém použitého datového typu.

Poté můžete zkusit dodělat detekci přetečení proměnné. Jelikož ale při zvýšení každých 100µs „vydrží“ tato proměnná počítat asi pět dní, neviděl bych to jako nutnost 🙂