2012-02-05 2 views
2

매우 기본적인 질문이 있습니다. 그러나, 나는 무엇을 시도 했는가, 나는 성공적으로 이것을 실행할 수 없었다.PIC C18 : 바이트에서 비트 읽기.

// Data pin 
#define SCLCD_DATA   LATBbits.LATB7 
#define SCLCD_DATA_TRIS  TRISBbits.TRISB7 

// Clock pin 
#define SCLCD_CLOCK   LATBbits.LATB6 
#define SCLCD_CLOCK_TRIS TRISBbits.TRISB6 

LED는 상태를 볼 74LS164의 출력 핀에 접속되어

는 I는 다음과 같은 하드웨어 구성 PIC18F2550 접속 된 시프트 레지스터 (74LS164)를 갖는다. 나는 unsigned char으로 선언 된 8 비트 변수를 가지고있다. 이 변수의 비트를 쉬프트 레지스터에 보내고 싶습니다. 시프트 레지스터에는 출력이 Q0-Q7로 명명 된 내부 플립 플롭이있다. 첫 번째 전송 된 비트가 Q0으로로드됩니다. 두 번째 비트를 전송하면 이전 Q0은 Q1으로 이동하고 새로 전송 된 비트는 Q0으로 오게됩니다. 전송이 완료되면 변수의 LSB가 시프트 레지스터의 Q0에 있다고 가정하고 MSB는 Q7에있게됩니다.

내 코드 (언어가 C18입니다) 이렇게 있습니다 :

void SCLCD_SendSerialBits(unsigned char unRegister) 
{ 
    // ucRegister is always passed as 0b10101010 for test 
    for (i=0; i<8; i++) 
    { 
     SCLCD_CLOCK = 0; 
     SCLCD_DATA = ((ucRegister & 0b10000000) == 0b10000000) ? 1 : 0; 
     ucRegister = ucRegister << 1; 
     SCLCD_CLOCK = 1; 
    } 
} 

내가 원하는대로 위의 코드는 실행되지 않습니다. 실행했을 때 0b11111111ucRegister 변수에로드 한 것처럼 모든 LED가 켜집니다.

그러나, 다음과 같은 사람은 아주 잘 작동 :

void SCLCD_SendSerialBits(void) 
{ 
    SCLCD_CLOCK = 0; SCLCD_DATA = 1;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 0;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 1;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 0;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 1;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 0;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 1;  SCLCD_CLOCK = 1; 
    SCLCD_CLOCK = 0; SCLCD_DATA = 0;  SCLCD_CLOCK = 1; 
} 

내 코드에 어떤 문제가 있습니까? 나는 오류가 라인 SCLCD_DATA = ((ucRegister & 0b10000000) == 0b10000000) ? 1 : 0;에있을 가능성이 가장 높지만, 아무리 많이 본다해도 문제는 아닐 것입니다. 내 코드에 어떤 문제가 있습니까?

도움이 될 것입니다.

+0

MBLAB 시뮬레이터를 통해 코드를 실행하고 예상대로 비트가 켜지고 꺼집니다. 나는 당신의 컴파일러 버전이 예상대로 출력을 켜는 명령어를 생성하고 있음을 확인하기 위해 동일한 작업을 수행 할 것을 제안한다. 컴파일러가 잘못된 코드를 생성하는 경우 최신 컴파일러 relee로 업그레이드 할 것입니다. 시뮬레이터가 정상적으로 작동하면 더 불길한 일이 일어나고 있습니다. 타이밍 문제 일 수 있습니까? 작동하는 코드는 작동하지 않는 코드보다 훨씬 빠르게 시동 레지스터에 시계를 설정합니다. 그러나, 나는 느린 전에 빠른 코드가 실패 할 것이라고 감사 할 것이라고 생각합니다. – user957902

답변

2

코드가 제대로 작동하는 것 같습니다. 이 읽기 쉽고 효율적으로처럼 내가 작성합니다 (시스템을 가정하는 것은 배럴 시프터가) : 배럴 쉬프터가없는 시스템의 경우

for (i=7; i>=0; i--) 
{ 
    SCLCD_CLOCK = 0; 
    SCLCD_DATA = ((ucRegister >> i) & 1); 
    SCLCD_CLOCK = 1; 
} 

, 코드의 변형

unsigned char ucMask = 0x80; 

    for (i=0; i<8; i++) 
    { 
     SCLCD_CLOCK = 0; 
     SCLCD_DATA = (ucRegister & ucMask) ? 1:0; 
     ucMask >>= 1; 
     SCLCD_CLOCK = 1; 
    } 

만약 내 첫 번째 또는 두 번째 예제가 작동하면 컴파일러가 상수 값을 처리하지 않거나 원래 코드에서 올바르게 비교하는 것처럼 들립니다.

0

오타 일 수도 있지만 매개 변수는 ucRegister가 아닙니다. ucRegister가 0b11111111 인 글로벌 일 수 있습니까?

관련 문제