얼마나에서 가치를 얻기 위해 제 15pin 의 32 비트 포트에서 팔?
-
05-07-2019 - |
문제
나 IC,DS1620 을 읽는 1 비트 시리얼 데이터에 오는 하나의 라인입니다.이 데이터를 사용하는 포트 중 하나의 팔 마이크로 컨트롤러(LPC2378).팔 포트는 32 비트입니다.어떻게 이 값으로 1 조금 변?
편집:다시 말해서 내가 필요로 직접적인 참조를 포 pin.
해결책
이 없 1 바이트 변수,그러나 너를 분리할 수 있는 특정 조금 예를 들어:
uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */
참고:내가 알지 못하는 경우에 당신이 계산 비트 숫자 0 에서 시작하는 1,록 >> 15
로 이동할 수 있습니다,하지만 당신은 아이디어를 얻을 수 있습니다.
다른 옵션은 사용하는 비트 필드,하지만 가져오는 지저분하고 IMO 가치가 없지 않는 한 모든 비트 값에 유용합니다.는 경우에 당신은 하나 또는 두 비트는,변화하고 마스킹은 방법입니다.
전반적인 이 문서 하는 데 사용할 수 있습니다.
다른 팁
CPU의 경우 Evan Teran의 답변을 사용해야합니다. 나는 단지 다른 ARM CPU의 비트 밴드 기능을 Cortex-M3과 같은 언급하고 싶었습니다. RAM/주변 장치의 일부 영역의 경우 모든 비트는 별도의 주소에 매핑되어 쉽게 접근 할 수 있습니다.
보다 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/behcjiic.html 자세한 내용은.
포트 레지스터에 직접 액세스 할 수 있다면 간단합니다 (ARM에 대한 경험이 없습니다). 비트와 원하는 비트에 해당하는 이진 마스크를 사용하여 다음과 같습니다.
var = (PORT_REGISTER & 0x00008000);
15 번째 비트가 '0'인 경우 Var는 0을 포함합니다. 또는 15 번째 비트가 '1'인 경우 0x00008000이 포함됩니다.
또한 '0'또는 '1'을 갖고 싶다면 다음을 바꿀 수 있습니다.
var = ((PORT_REGISTER & 0x00008000) >> 15);
컴파일러와 함께 제공되는 헤더 파일에는 모든 마이크로 컨트롤러 레지스터에 대한 선언과 해당 레지스터의 비트가 포함되어 있습니다.
이 특정 기사에서는 포트 입력 레지스터가 PORTA
, 당신이 원하는 비트에는 마스크가 정의 된 마스크가 있습니다. PORTA15
.
그런 다음 그 핀의 상태를 읽으십시오.
PinIsSet = (PORTA & PORTA15) == PORTA15;
또는 동등하게, 사용 3 배 운영자:
PinIsSet = (PORTA & PORTA15) ? 1 : 0;
일반적으로 모든 레지스터와 비트가하는 일에 대해서는 참조 설명서를 참조하십시오. 또한 몇 가지 예를보십시오. (이 페이지는 Keil 웹 사이트의 페이지입니다 둘 다 포함되어 있으며 웹에는 다른 많은 예가 있습니다.)
LPC2378 (다른 LPC2XXXX 마이크로 컨트롤러 패밀리)에서 I/O 포트는 시스템 메모리에 있으므로 다음과 같은 일부 변수를 선언해야합니다.
#define DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define DALLAS_PIN (1<<15)
0xe0028000은 Port0의 데이터 레지스터의 주소이며 0xe0028008은 Port0의 데이터 방향 레지스터 주소입니다. 포트에 따라이를 수정하고 앱에 사용 된 비트를 수정해야합니다. 그런 다음 코드 함수에서 writ
#define set_dqout() (DALLAS_DDR&=~DALLAS_PIN) /* Let the pull-up force one, putting I/O pin in input mode */
#define reset_dqout() (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define read_dqin() (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */
이것이 도움이되기를 바랍니다.
문안 인사!
비트를 테스트하는 경우 C의 운영자 평가 순서를 명심하는 것이 좋습니다.
if( port & 0x80 && whatever() )
방금 쓴 것처럼 예상치 못한 행동을 초래할 수 있습니다.
if( port & (0x80 && whatever()) )
그러나 아마도
if( (port & 0x80) && whatever() )