Odottamattomat negatiiviset arvot abs () -toiminnosta inline with analogRead

Kun otan näytteitä A0: sta 0-5V-signaalilla arduino-mikrossa alla olevan koodin kanssa, saan jonkin verran negatiiviset arvot.

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

Arvot:

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

Suoritettaessa (ilmeisesti) matemaattisesti vastaavan koodin alla saan vain positiiviset arvot.

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

En usko, että tämä on kokonaisluvun ylivuoto kuten tässä viestissä , koska kun vaihdan tilaan long sensor = 0, saan samat negatiiviset tulokset.

Mitä täällä tapahtuu?

vastaus

abs() on määritelty kohdassa Arduino.h makrona:

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

Makro ei arvioi samalla tavalla kuin funktio.

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

Tämä käsky laajennetaan käännösaikaan:

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

Nyt ”virhe” on helppo ymmärtää. Analoginen tappi luetaan kahdesti. Virheen voi välttää lisäämällä seuraava rivi luonnokseen ensin:

#undef abs 

Tämä poistaa makron abs() ja vakiokirjastofunktiota .

Kippis!

Kommentit

  • Virhe on abs() -makro Arduino.h
  • Kiitos selkeästä vastauksesta. Minulla ei ollut aavistustakaan siitä, että makroja oli edes Arduino-maailmassa. Löysin viestin vuodelta 2011, jossa keskustellaan tästä ja lyhyt luettelo muista makroista. Tiedätkö lopullisen luettelon? Onko vain enemmän " Arduinoesque " ja parempaa käytäntöä välttää useita tehtäviä rivillä ja pitää kiinni yhdestä toiminnosta riviä kohden?
  • Ei, ei ole arduinoeskeellisempää käyttää vain yhtä operaatiota yhdessä tehtävässä. Joskus tämä tehdään helpottamaan lukemista. Makrojesi ongelmalla ei ole paljon tekemistä Arduinon kanssa. Kyse on yleisemmin siitä, miten kääntäjä arvioi makrot. Kääntäjä korvaa makron siinä määritetyllä ' määritelmässä (ja lisää argumentin). Se ei ole toiminto. Ja tämä ei ole Arduino-spesifinen, mutta riippuu kääntäjästä. Voit käyttää makroja myös ohjelmoidessasi muiden kääntäjien kanssa. Makrot voivat olla hyödyllisiä, mutta niitä on käytettävä varoen.
  • @chrisl, jo on olemassa abs ja labs -toiminto. Arduino abs -makro on arduinon naurettava virhe. Aaron Ciuffo, napsauta linkkiä Arduino.h vastaukseen Mikael Patel, siellä näet muut makrot. Toinen asia on olla käyttämättä muuttujaa nimellä " B1 ".

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *