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í!
abs()
v Arduino.habs
alabs
funkce. Makro arduinoabs
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 ".