2012-01-23 39 views
0

我正在使用MPLABx和HI Tech PICC編譯器。我的目標芯片是PIC16F876。通過查看pic16f876.h包含文件,似乎應該可以通過名稱來引用它們來設置芯片的系統寄存器。使用Hi Tech PICC在PIC16F876中設置寄存器值

例如,在CCP1CON寄存器中,位0至3設置CCP和PWM模塊的工作方式。通過查看pic16f876.h文件,看起來應該可以單獨引用這4個位,而不改變CCP1CON寄存器其餘部分的值。

但是,我試圖以各種方式參考這些4位而沒有成功。

我試過了;

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

但都失敗了。我已閱讀Hi Tech 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。由於它是一個位域,因此只需要在位域中定義有效位的數量,而不是代碼中的全部八位。

所以:

CCP1CONbits.CCP1M = 0x0c; 

應該是什麼你正在嘗試做的等價物。如果您想一次設置全部八位,則可以使用CCP1CON = 0xc0。這會將CCP1M位設置爲0x0c,將所有其他位設置爲零。

你給也有個別位符號,所以你可以這樣做太頭:

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

雖然位域的方法是清潔劑。

+0

謝謝!這是我錯過的「位」。我無法在PICC手冊中的任何地方找到它。我錯過了什麼嗎?你是正確的,這是更清潔,這就是爲什麼我一直在努力實現它。到目前爲止,我一直在做個別位分配。 – Michael

相關問題