Ha az A0-ból 0-5V jelet veszünk mintát egy arduino mikro-n az alábbi kóddal, negatív értékek.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Értékek:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
A (látszólag) matematikai futtatásakor ekvivalens kód alatt kapok kizárólag pozitív értékeket.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
Nem hiszem, hogy ez egy egész szám túlcsordulás, mint ebben a bejegyzésben, mert amikor a long sensor = 0
-re váltok, ugyanazokat a negatív eredményeket kapom.
Mi folyik itt?
Válasz
abs()
a Arduino.h makróként:
#define abs(x) ((x)>0?(x):-(x))
A makró nem ugyanúgy értékel, mint egy függvény.
sensor = abs(analogRead(A0) - 512);
Ez az utasítás fordításkor kibővül a következőre:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Most a “hiba” könnyen érthető. Az analóg csapot kétszer olvassák fel. A “hiba” elkerülhető, ha a következő sort adja először a vázlatához:
#undef abs
Ez eltávolítja a abs()
és a szabvány könyvtár függvényt használják.
Egészségére!
abs()
makró Arduino.habs
éslabs
függvény. Az arduinoabs
makró nevetséges baklövés az arduino részéről. Aaron Ciuffo, kattintson az Arduino.h linkre Mikael Patel válaszában, ott látja a többi makrót. A másik dolog az, hogy ne használjunk " B1 " nevű változót.