作者easypro ()
看板ASM
標題Re: [問題] bit field struct 成員同時存取
時間Sun Sep 21 01:40:47 2014
※ 引述《chrisos (克里斯)》之銘言:
: 其實一直在猶豫要發哪個版...此版幾乎以assembly為主
: 但我又覺得這種mcu的東西在這問好像比較有人懂...
: 我有看過版規了,應該是沒越線。
: 真不行的話我在刪文,感謝各位。
: ※ [本文轉錄自 C_and_CPP 看板 #1K7OshVX ]
: 作者: chrisos (克里斯) 看板: C_and_CPP
: 標題: [問題] bit field struct 成員同時存取
: 時間: Sat Sep 20 22:22:25 2014
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: MPLAB
: 問題(Question):
: 我現在在進行PIC單晶片的學習,使用C語言與HI-TECH編譯器來開發。
: 我從我使用的晶片的header file (pic16f73.h) 裡看到他對於bit field的一些用法
: 譬如說一個PORTA的rigister掌握著六個I/O PIN (R0~R5)
: 他在header file裡面的定義是這樣
: // ----- PORTA bits --------------------
: typedef union {
: struct {
: unsigned char RA0:1;
: unsigned char RA1:1;
: unsigned char RA2:1;
: unsigned char RA3:1;
: unsigned char RA4:1;
: unsigned char RA5:1;
: unsigned char :1;
: unsigned char :1;
: };
: } __PORTA_bits_t;
: extern volatile __PORTA_bits_t __at(PORTA_ADDR) PORTA_bits;
: #ifndef NO_BIT_DEFINES
: #define RA0 PORTA_bits.RA0
: #define RA1 PORTA_bits.RA1
: #define RA2 PORTA_bits.RA2
: #define RA3 PORTA_bits.RA3
: #define RA4 PORTA_bits.RA4
: #define RA5 PORTA_bits.RA5
: #endif /* NO_BIT_DEFINES */
: 當然上面還有一些其他的#define來連結PORTA,不過那不是我問題的重點。
: 當我需要使用PORTA的I/O PIN時我可以用兩種方法來達成
: RA0=1; RA1=1; //這是我們一般比較常見的用法 單獨控制
: 可是他也有另一種用法,直接指定PORTA的值,如下:
: PORTA=0x03; // RA0、RA1=1;
: 請問這種方法是怎麼實現的?
: 我上網GOOGLE到的bit field說明幾乎都是用第一種方法來存取。
因為它有先define
#define PORTA_ADDR 0x0005
extern __sfr __at (PORTA_ADDR) PORTA;
再看
extern volatile __PORTA_bits_t __at(PORTA_ADDR) PORTA_bits;
所以它可以用PORTA存取,也可以用PORTA_bits.RA0,也可以用RA0
: 我試著自己創建一個struct,但都無法做到像他這樣存取。
: EX:
: typedef union {
: struct {
: unsigned char A0:1;
: unsigned char A1:1;
: unsigned char A2:1;
: unsigned char A3:1;
: unsigned char A4:1;
: unsigned char A5:1;
: unsigned char A6:1;
: unsigned char A7:1;
: };
: } test;
: 下面丟值
: test = 0xff;
: 錯誤訊息是
: illegal conversion between types
: int -> union S1
: 為什麼是這種錯誤...
: 即使我丟 0b11111111 這樣的值進去他也是跟我說是int
你跟誰做union? 裡面沒有這變數,你這只等同於一個struct沒做union啊
: typedef union {
unsigned char PORTA; <--加上它
: struct {
: unsigned char A0:1;
: unsigned char A1:1;
: unsigned char A2:1;
: unsigned char A3:1;
: unsigned char A4:1;
: unsigned char A5:1;
: unsigned char A6:1;
: unsigned char A7:1;
: };
: } test
: 就算我直接輸入
: test=(char)3;
test.PORTA = 3;
: 他的錯誤訊息會變成unsigned char
: 請問我該怎麼設定才會變成預設的PORTA那樣可以直接對整個值做編輯呢?
: 以上,謝謝各位。
: 補充說明(Supplement):
: 貼一下他的PIC16F73.h 有興趣可以看一下
: 有需要看PORTA的部分直接搜尋PORTA就好了,搜尋結果只有14個。
此外,改用XC8吧..
至於__sfr __at這種語法可能是HI-TECH的關鍵字或define過的字串
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.39.57
※ 文章網址: http://webptt.com/m.aspx?n=bbs/ASM/M.1411234849.A.AB7.html
1F:推 chrisos: 感謝,看來是我沒有清楚UNION的用處,經過修改後的確 09/22 16:09
2F:→ chrisos: 可以控制整個BYTE了,謝謝您。 09/22 16:09