2012-04-11 4 views
1

저는 Arduino와 협력 중이며 포트 레지스터로 작업하기 시작했습니다. 나는 속도 증가와 동시에 여러 포트를 변경할 수있는 능력을 좋아합니다. 그러나 포트 레지스터를 사용하여 단일 핀 변경을 감시하는 방법을 모르겠습니다. (나는 그것이 bitmath 수행 할 수 있습니다,하지만 난 심지어 시작하는 방법을 모르는 것 같아요.)최하위 비트의 변경 사항을 어떻게 보냅니 까?

그래서 검사 할 때 내 포트 나는 이런 식으로 뭔가 얻어야한다 등록 :

PINB = B000xxxxx 

x이 내 핀 값입니다. 그 핀들은 모두 바뀔 수있었습니다. 가장 오른쪽 (가장 중요하지 않은) 비트가 변경된시기를 알고 싶습니다. 마지막 비트가 0에서 1으로 바뀌 었음을 확인하기 위해 비트율을 어떻게 사용할 수 있습니까?

+3

if (value & 1) {...} else {...} ' – wildplasser

+0

쉽지, 응? –

+0

예, 가장자리 감지를 원할 때까지. 이 경우 동일한 조건에서 하나 또는 두 개의 루프가 필요합니다. – wildplasser

답변

2

"비트 매스"는 실제로 문제의 해답입니다. 귀하의 경우 : x & 0x01는 가장 낮은 비트를 제외한 모든 것을 "마스크"합니다. 결과는 0 또는 1과 비교할 수 있습니다.

일반적인 관용구는 다음과 같습니다

x & 0x01 // get only the lowest bit 
x & ~0x01 // clear only the lowest bit 
x & 0xFE // same: clear only the lowest bit 
x | 0x01 // set the lowest bit (others keep their state) 
+0

깔끔한! 예제를 가져 주셔서 감사합니다. –

+0

첫 번째 "지우기"예제는 고집하고 싶은 예제입니다. 두 번째 예제 (x & 0xFE)는 8 비트 전용 예입니다. 상위 비트가 있으면 그 비트도 지워집니다. –

1

은 비트가 변경된 경우, 당신은 다른 사람들이 말했듯이 당신이 밖으로 마스크, 이는 이전 값을 필요로 찾으려면 -

int lastValue = PINB & 0x01; 

을 다음에 귀하가 작성한 코드

int currentValue = PINB & 0x01; 

현재 핀 값의 LSB를 얻으십시오.

비트에 변경 사항이 있는지 확인하려면 "배타적 OR"(^) 연산자를 사용하십시오. 두 비트가 다른 경우에만 "참"입니다.

if (lastValue^currentValue) { 
    // Code to execute goes here 

    // Now save "last" as "current" so you can detect the next change 
    lastValue = currentValue; 
} 
관련 문제