문제

나 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() )
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top