Ved prøvetaking fra A0 med et 0-5V signal på en arduino micro med koden under får jeg noen negative verdier.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Verdier:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
Når du kjører (tilsynelatende) matematisk ekvivalent kode nedenfor får jeg utelukkende positive verdier.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
Jeg tror ikke dette er et heltalloverløp som i dette innlegget fordi når jeg bytter til long sensor = 0
får jeg de samme negative resultatene.
Hva skjer her?
Svar
abs()
er definert i Arduino.h som en makro:
#define abs(x) ((x)>0?(x):-(x))
En makro evalueres ikke på samme måte som en funksjon.
sensor = abs(analogRead(A0) - 512);
Denne uttalelsen utvides ved kompileringstid til:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Nå «feilen» er lett å forstå. Den analoge pinnen leses to ganger. «Feilen» kan unngås ved å legge til følgende linje først i skissen din:
#undef abs
Dette fjerner makroen abs()
og standard biblioteksfunksjon blir brukt i stedet.
Skål!
abs()
makroen i Arduino.habs
oglabs
funksjon. Arduinoabs
makroen er en latterlig bommert av arduino. Aaron Ciuffo, klikk på lenken til Arduino.h i svaret av Mikael Patel, der ser du de andre makroene. En annen ting er å ikke bruke en variabel med navnet " B1 ".