Vypadá to, jakoby se program zastavil na poloviční dobu, než by měl.
Krystalem to asi nebude, protože v tom případě by i funkce "micros()" vracela špatné výsledky.
Funkce "micros()" ale funguje správně.
Přikládám velice zjednodušený příklad.
Očekávám, že se alespoň na 10 sekund rozsvítí LED a zahlásí se doba trvání něco přes 10 000 000us.
(Samotné delayMicroseconds by mělo trvat 10 sekund + nějaké zpoždění na ostatních příkazech ve smyčce.)
Ve skutečnosti se ale LED rozsvítí jen asi na 5 sekund.
Co dělám špatně?
Nemusí se ještě někde něco přepnout?
Kód: Vybrat vše
#define pin_LED PB0 // signalizacni LED
unsigned long start_cas;
unsigned long stop_cas;
void setup()
{
pinMode(pin_LED, OUTPUT);
Serial.begin (38400);
digitalWrite(pin_LED, HIGH); // rozsvitit LED
start_cas = micros();
for (unsigned int i = 0; i < 10000 ; i++)
{
delayMicroseconds(1000); // ocekavam 10 000 * 1 000us = 10s
}
stop_cas = micros();
digitalWrite(pin_LED, LOW); // zhasnout LED
Serial.print("doba trvani [us]: "); // skutecny vysledek:
Serial.println(stop_cas - start_cas); // "doba trvani [us]: 5007297"
}
void loop(void)
{
}
Když místo: "delayMicroseconds(1000)" použiju obyčejné "delay(1)", je výsledek v pořádku: "doba trvani [us]: 10014974"
Zkoušel jsem použít i kratší delayMicroseconds(), abych vyloučil případné přetečení proměnných, ke kterému by ale nemělo dojít ani při těch 10 sekundách.
Výsledky jsou následující:
Kód: Vybrat vše
delayMicroseconds(1000) ..... očekávaný výsledek 10 000 000us ..... doba trvani [us]: 5 007 297
delayMicroseconds( 100) ..... očekávaný výsledek 1 000 000us ..... doba trvani [us]: 503 555
delayMicroseconds( 50) ..... očekávaný výsledek 500 000us ..... doba trvani [us]: 253 376
delayMicroseconds( 10) ..... očekávaný výsledek 100 000us ..... doba trvani [us]: 53 232
Podle výsledků se zdá, že opravdu ta funkce "delayMicroseconds()" vytváří poloviční pauzy, než je zadáno v jejím parametru a že ten zbytek smyčky trvá konstantně něco přes 3ms (tedy kromě toho původního delayMicroseconds(1000), kde je trvání zbytku smyčky dvojnásobné)
Co s tím?
Je ta chyba jen u mně, nebo máte podobné výsledky?