analogRead

아두 이노 마이크로에서 0-5V 신호로 A0에서 샘플링 할 때 아래 코드를 사용하여 abs () 함수의 예기치 않은 음수 값을 얻을 수 있습니다. 음수입니다.

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

값 :

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

(분명히) 수학적으로 실행할 때 아래의 동등한 코드는 독점적으로 양수 값을 얻습니다.

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

게시물 에서처럼 이것이 정수 오버플로라고 생각하지 않습니다. long sensor = 0로 전환하면 동일한 부정적인 결과가 나타납니다.

여기서 무슨 일이 일어나고 있습니까?

답변

abs() Arduino.h 매크로 :

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

매크로는 함수와 같은 방식으로 평가되지 않습니다.

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

이 명령문은 컴파일시 다음으로 확장됩니다.

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

지금 “오류”는 이해하기 쉽습니다. 아날로그 핀은 두 번 읽 힙니다. “오류”는 스케치에서 먼저 다음 줄을 추가하여 방지 할 수 있습니다.

#undef abs 

이렇게하면 매크로가 제거됩니다. abs() 표준 라이브러리 함수 가 대신 사용됩니다.

건배!

댓글

  • 오류는 다음 위치의 abs() 매크로입니다. Arduino.h
  • 명확한 답변에 감사드립니다. Arduino 세계에 매크로가 존재한다는 사실조차 몰랐습니다. 2011 년의 게시물 과 이에 대해 논의한 다른 매크로의 짧은 목록을 찾았습니다. 최종 목록을 알고 있습니까? " Arduinoesque "에 불과하고 한 줄에 여러 할당을 피하고 한 줄에 하나의 작업을 고수하는 것이 더 나은 방법인가요?
  • 아니요, 하나의 할당에서 하나의 작업 만 사용하는 것은 더 이상 Arduinoesque가 아닙니다. 때때로 이것은 읽기 쉽도록하기 위해 수행됩니다. 매크로 문제는 Arduino와 많이 관련 될 필요가 없습니다. 더 일반적으로 컴파일러가 매크로를 평가하는 방법에 관한 것입니다. 컴파일러는 매크로를 '의 정의로 작성된 매크로로 대체합니다 (그리고 인수에 넣습니다). 기능이 아닙니다. 그리고 이것은 Arduino에만 국한되지 않지만 컴파일러에 따라 다릅니다. 다른 컴파일러로 프로그래밍 할 때 매크로를 사용할 수도 있습니다. 매크로는 유용 할 수 있지만주의해서 사용해야합니다.
  • @chrisl, 이미 abslabs 함수. arduino abs 매크로는 arduino의 우스꽝스러운 실수입니다. Aaron Ciuffo, Mikael Patel의 답변에서 Arduino.h 링크를 클릭하면 다른 매크로가 표시됩니다. 또 다른 방법은 " B1 "라는 이름의 변수를 사용하지 않는 것입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다