2013-10-03 5 views
0

AVR로 프로그래밍 중이며 핀을 출력으로 설정하려고합니다. 다음과 같이 Register 및 Pin 번호를 유지하는 구조체를 만들었습니다.합격이 함수로 정의됩니다.

typedef struct Pin{ 
    uint8_t pinNo; 
    volatile uint8_t* pinReg; 
}; 

이 함수는 핀을 출력으로 설정합니다. 이런 식으로 호출

void pin_output(struct Pin pin){ 
    //DDRA |= _BV(DDA6); 
    *(pin.pinReg) |= _BV(pin.pinNo); 
} 

:

struct Pin pin6; 
pin6.pinNo = DDA6; 
pin6.pinReg = DDRA; 
pin_output(pin6); 

이 잘 작동하지만, LED 밝기 매우 희미한. 다음과 같이 출력을 설정하면 :

DDRA |= _BV(DDA6); 

핀의 예상 밝기는 약 3 ~ 5 배 더 밝습니다. 밝기에 문제가있는 기능에서 무엇이 손실 되었습니까?

답변

2

분명히 매크로 DDRA은 어떤 종류의 왼쪽 값을 일부 하드웨어 레지스터에 연결합니다. 이 값을 변경하면 레지스터와 밝기가 변경됩니다. 실제 입력하면 그 좌변은 다음 struct Pin 당신이

pin6.pinReg = &DDRA; 

참고로 구조체의 해당 멤버를 초기화해야 & 연산자를 통해 통과하기 위해, uint8_t 경우.

코드에있는 pin6.pinReg = DDRA은 컴파일하지 않아야하며, 적어도 호환되지 않는 유형의 경고가 표시되어야합니다.

+0

죄송합니다. 일부 디버그 코드가 남아 있습니다. 나는 질문을 업데이트했다. 내가 말한대로 pin6.pinReg를 지정했지만 밝기는 여전히 희미합니다. – Nick

+0

@ 닉 : 작동하지 않을 이유가 없습니다. 일단 그것을 추가하면 &가 작동 할 것입니다. – AnT

+0

죄송합니다, 나는 바보입니다. 질문 코드를 업데이트하고 실제 코드를 업데이트 한 것으로 가정하고 ... haha. 감사합니다. – Nick