2012-01-23 5 views
0

MPLABx와 HI Tech PICC 컴파일러를 사용하고 있습니다. 내 타겟 칩은 PIC16F876입니다. pic16f876.h 인클루드 파일을 보면 이름을 참조하여 칩의 시스템 레지스터를 설정할 수 있어야합니다.하이테크 PICC를 사용하여 PIC16F876의 레지스터 값 설정

예를 들어 CCP1CON 레지스터 내에서 0 ~ 3 비트는 CCP 및 PWM 모듈의 작동 방식을 설정합니다. pic16f876.h 파일을 보면 CCP1CON 레지스터의 나머지 값을 변경하지 않고 이러한 4 비트 만 참조 할 수 있어야합니다.

그러나 나는이 4 비트를 다양한 방법으로 참조하려고 시도했지만 성공하지 못했습니다.

나는 시도했다.

CCP1CON.CCP1M=0xC0; this results in "error: struct/union required 
CCP1CON:CCP1M=0xC0; this results in "error: undefined identifier "CCP1M" 

그러나 모두 실패했습니다. 하이테크 PICC 컴파일러 설명서를 읽었지만이를 수행하는 방법을 알 수 없습니다.

pic16f876.h 파일에서 .h 파일에 정의되어 있으므로 시스템 레지스터 내에서 이러한 하위 집합을 이름으로 참조 할 수있는 것처럼 보입니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? pic16f876.h

// Register: CCP1CON 
volatile unsigned char   CCP1CON    @ 0x017; 
// bit and bitfield definitions 
volatile bit CCP1Y    @ ((unsigned)&CCP1CON*8)+4; 
volatile bit CCP1X    @ ((unsigned)&CCP1CON*8)+5; 
volatile bit CCP1M0    @ ((unsigned)&CCP1CON*8)+0; 
volatile bit CCP1M1    @ ((unsigned)&CCP1CON*8)+1; 
volatile bit CCP1M2    @ ((unsigned)&CCP1CON*8)+2; 
volatile bit CCP1M3    @ ((unsigned)&CCP1CON*8)+3; 
#ifndef _LIB_BUILD 
volatile union { 
struct { 
    unsigned CCP1M    : 4; 
    unsigned CCP1Y    : 1; 
    unsigned CCP1X    : 1; 
}; 
struct { 
    unsigned CCP1M0    : 1; 
    unsigned CCP1M1    : 1; 
    unsigned CCP1M2    : 1; 
    unsigned CCP1M3    : 1; 
}; 
} CCP1CONbits @ 0x017; 
#endif 

답변

1

에서

발췌 당신은 구조체의 인스턴스를 통해 비트 필드의 멤버에 액세스해야합니다. 이 경우는 CCP1CONbits입니다. 비트 필드이기 때문에 코드의 전체 8 비트가 아니라 비트 필드에 정의 된 중요 비트 수만 있으면됩니다.

그래서 :

CCP1CONbits.CCP1M = 0x0c; 

당신이 뭘 하려는지에 해당이어야한다. 8 비트를 모두 한 번에 설정하려면 CCP1CON = 0xc0을 사용할 수 있습니다. 그러면 CCP1M 비트는 0x0c로 설정되고 다른 모든 비트는 0으로 설정됩니다.

당신도이 작업을 수행 할 수 있도록 또한, 각각의 비트 문자가 준 헤더 : 비트 필드의 접근 방식은 깨끗

CCP1M0 = 1; 
CCP1M1 = 1; 
CCP1M2 = 0; 
CCP1M3 = 0; 

있지만.

+0

고마워요! 내가 잃어버린 "비트"추가 사항이었다. 나는 PICC 매뉴얼 어디서나 그것을 찾을 수 없습니다. 내가 놓친 게 있니? 당신은 정확합니다, 이것은 훨씬 더 깨끗합니다. 그래서 나는 그것을하려고 노력했습니다. 나는 지금까지 개별 비트 할당을 해왔다. – Michael