2013-10-03 45 views
0

我正在用AVR編程,我試圖創建一個函數來設置一個引腳作爲輸出。我做了一個結構來保存這樣的寄存器和引腳號:傳遞定義爲函數

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隱藏某種左值綁定到某些硬件寄存器。改變左值可以改變寄存器和亮度。如果實際類型如果左值是uint8_t,然後才能通過你的struct Pin你應該初始化結構的相應成員作爲

pin6.pinReg = &DDRA; 

注意&運營商通過。

,你在你的代碼具有的pin6.pinReg = DDRA甚至不應該編譯或至少應該產生不兼容的類型分配警告。

+0

對不起,這是一些遺留的調試代碼。我更新了問題。按照您的說法,我分配了pin6.pinReg,但亮度仍然很暗。 – Nick

+0

@尼克:沒有理由不工作。一旦你添加'&'它應該工作。 – AnT

+0

對不起,我很笨。我更新了問題代碼,只是假設我更新了實際的代碼,並沒有......哈哈。謝謝現在很好。 – Nick