Når der samples fra A0 med et 0-5V signal på en arduino micro med koden nedenfor får jeg nogle negative værdier.
int sensor = 0; sensor = abs(analogRead(A0) - 512);
Værdier:
77 25 -74 -58 46 113 -74 102 -91 -51 -126 47 31
Når du kører (tilsyneladende) matematisk tilsvarende kode nedenfor får jeg udelukkende positive værdier.
int sensor = 0; sensor = analogRead(A0); sensor = sensor - 512; sensor = abs(sensor);
Jeg tror ikke, dette er et heltalsoverløb som i dette indlæg fordi når jeg skifter til long sensor = 0
får jeg de samme negative resultater.
Hvad sker der her?
Svar
abs()
er defineret i Arduino.h som en makro:
#define abs(x) ((x)>0?(x):-(x))
En makro evalueres ikke på samme måde som en funktion.
sensor = abs(analogRead(A0) - 512);
Denne erklæring udvides ved kompileringstid til:
sensor = ((analogRead(A0) - 512)>0?(analogRead(A0) - 512):-(analogRead(A0) - 512));
Nu “fejlen” er let at forstå. Den analoge pin læses to gange. “Fejlen” kan undgås ved at tilføje følgende linje først i din skitse:
#undef abs
Dette fjerner makroen abs()
og standardbiblioteksfunktionen bruges i stedet.
Skål!
abs()
makroen i Arduino.habs
oglabs
funktion. Arduinoabs
makroen er en latterlig bommert af arduino. Aaron Ciuffo, klik på linket til Arduino.h i svaret af Mikael Patel, der ser du de andre makroer. En anden ting er ikke at bruge en variabel med navnet " B1 ".