2013-03-18 1 views
0

마이크로 컨트롤러를 프로그래밍했다면, 주어진 레지스터의 선택 비트를 조작하거나 모든 것에 바이트를 쓰는 것에 익숙 할 것입니다. 예를 들어 C를 사용하는 PIC에서 모든 비트를 설정하기 위해 PORTA에 전체 바이트를 쓸 수도 있고 PORTAbits.RA #에 주소를 지정하여 단일 비트를 설정할 수도 있습니다. 나는이 구조체/공용체가 정의 된 방식을 모방하려고 노력 중이므로 프로그램에서 변수를 사용하여 동일한 작업을 수행 할 수있다. 특히, 때 마이크로 컨트롤러는 내가 이전보다 우아이러한 레지스터와 같은 구조체의 모든 필드를 처리하는 방법은 무엇입니까?

REGISTER = 0; 

분명히

REGISTERbits.BIT0 = 0; 
REGISTERbits.BIT1 = 0; 
... 
//or 
REGISTERbits = (0,0,0,0,0,0,0,0); 

대처럼 자신이 뭔가 정의 레지스터를 재설정 할 수있게하려면 켜집니다 줄 간격을 많이 절약 할 수 있습니다. 각각의 모든 레지스터 ...

#ifndef __18F2550_H 
#define __18F2550_H 
.... 

extern volatile near unsigned char  LATA; 
extern volatile near struct { 
    unsigned LATA0:1; 
    unsigned LATA1:1; 
    unsigned LATA2:1; 
    unsigned LATA3:1; 
    unsigned LATA4:1; 
    unsigned LATA5:1; 
    unsigned LATA6:1; 
} LATAbits; 

을 여러 바이트 레지스터는 Registerbits에 대한 구조체의 조합을 사용 : 마이크로 컨트롤러의 헤더 파일은 다음과 같이 그것을 않습니다. 내 초기화/선언은 메인 소스 파일이 아닌 헤더에 있기 때문에, 나는 통근 오프 근처 광산 하락했습니다

volatile unsigned char InReg; 
volatile struct{ 
    unsigned NSENS:1; //One magnetic sensor per direction 
    unsigned SSENS:1; 
    unsigned ESENS:1; 
    unsigned WSENS:1; 
    unsigned YBTN:1; //One crosswalk button input per axis 
    unsigned XBTN:1; //(4 buttons tied together each) 
    unsigned :2; 
} InRegbits; 

을 ...하지만 컴파일에 InReg 및 InRegbits는 두 개의 분리 된 위치로 정의된다 inRegbits를 변경하려면 InReg에 쓸 수 없습니다. 이것을 변경하여 어떻게 작동합니까? 특별한 마이크로 컨트롤러 레지스터이기 때문에 내가 복사하려고하는 것은 작동합니까? 어떤 도움

+0

당신은 당신 자신의 질문에 대답했다고 생각합니다 : 노조 – Scavokovich

답변

3
volatile union InReg { 
    unsigned char InRegAll; 
    struct near { 
     unsigned NSENS:1; //One magnetic sensor per direction 
     unsigned SSENS:1; 
     unsigned ESENS:1; 
     unsigned WSENS:1; 
     unsigned YBTN:1; //One crosswalk button input per axis 
     unsigned XBTN:1; //(4 buttons tied together each) 
     unsigned :2; 
    } InRegbits; 
} 

에 대한

덕분에이 코드는 휴대용 수 없다는 점에 유의하십시오.

+0

나는 이것이 얻을 수있는만큼 좋다고 생각합니다. 내가 비트 구조체의 이름을 지정할 필요조차 없다는 것을 알게된다. –

2

동일한 결과를 얻으려면 공용체 내에 두 개의 구조체가 있어야합니다. 표준에 따르면, 유니온 멤버가 구조체 인 경우 첫 번째 구조체 멤버 형식이 호환되고 (동일한 비트 폭과 관련이있는) 동일한 멤버로 작동 할 수 있습니다. 그렇지 않으면 다른 멤버를 통해 공용 멤버에 액세스하는 것은 정의되지 않은 동작입니다.

volatile union { 
    volatile struct { 
     unsigned int InReg; 
    } InReg; 
    volatile struct { 
     unsigned NSENS:1;  //One magnetic sensor per direction 
     unsigned SSENS:1; 
     unsigned ESENS:1; 
     unsigned WSENS:1; 
     unsigned YBTN:1;  //One crosswalk button input per axis 
     unsigned XBTN:1;  //(4 buttons tied together each) 
     unsigned:2; 
    } InRegbits; 
} Reg_s; 
관련 문제