Neočekávané záporné hodnoty z funkce abs () vložené do analogRead

Při vzorkování z A0 se signálem 0-5V na arduino micro s níže uvedeným kódem dostanu nějaké záporné hodnoty.

int sensor = 0; sensor = abs(analogRead(A0) - 512); 

Hodnoty:

77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31 

Při matematickém spuštění (zjevně) ekvivalentní kód níže Získávám výhradně kladné hodnoty.

int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor); 

Nemyslím si, že se jedná o celočíselné přetečení jako v tomto příspěvku , protože když přepnu na long sensor = 0 získám stejné negativní výsledky.

Co se to tady děje?

Odpověď

abs() je definována v Arduino.h jako makro:

 #define abs(x) ((x)>0?(x):-(x)) 

Makro se nevyhodnocuje stejně jako funkce.

 sensor = abs(analogRead(A0) - 512); 

Toto prohlášení bude v době kompilace rozšířeno na:

 sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512)); 

Nyní „chyba“ je snadno pochopitelná. Analogový pin se čte dvakrát. „Chybě“ se lze vyhnout přidáním následujícího řádku do skici:

#undef abs 

Tímto odstraníte makro abs() a standardní funkce knihovny .

Na zdraví!

Komentáře

  • Chyba je makro abs() v Arduino.h
  • Děkujeme za jasnou odpověď. Netušil jsem, že makra ve světě Arduina vůbec existují. Našel jsem příspěvek z roku 2011, který o tom pojednává a krátký seznam dalších maker. Víte o definitivním seznamu? Je to jen více " Arduinoesque " a lepší praxe, jak se vyhnout více přiřazením v řádku a držet se jedné operace na řádku?
  • Ne, není více Arduinoesque používat pouze jednu operaci v jednom úkolu. Někdy se tak děje, aby se usnadnilo čtení. Váš problém s makry nemusí s Arduinem moc souviset. Obecněji jde o to, jak kompilátor vyhodnocuje makra. Kompilátor nahradí makro tím, co je v něm napsáno ' s definicí (a vloží do argumentu). To není funkce. A to není specifické pro Arduino, ale záleží na kompilátoru. Při programování s jinými překladači můžete také použít makra. Makra mohou být užitečná, ale musíte je používat opatrně.
  • @chrisl, již existují abs a labs funkce. Makro arduino abs je absurdní chyba od arduina. Aarone Ciuffo, klikni na odkaz na Arduino.h v odpovědi Mikaela Patel, tam uvidíš další makra. Další věcí je nepoužívat proměnnou s názvem " B1 ".

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *