作者chrisos (克里斯)
看板ASM
標題Fw: [問題] bit field struct 成員同時存取
時間Sat Sep 20 22:40:39 2014
其實一直在猶豫要發哪個版...此版幾乎以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說明幾乎都是用第一種方法來存取。
我試著自己創建一個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
就算我直接輸入
test=(char)3;
他的錯誤訊息會變成unsigned char
請問我該怎麼設定才會變成預設的PORTA那樣可以直接對整個值做編輯呢?
以上,謝謝各位。
補充說明(Supplement):
貼一下他的PIC16F73.h 有興趣可以看一下
http://ppt.cc/qSYU
有需要看PORTA的部分直接搜尋PORTA就好了,搜尋結果只有14個。
--
【微小說】我意外失明,女友不離不棄。後來,她遭遇車禍,臨終前把角膜捐給了我。
護士告訴我,女友離開的時候微笑著,讓我用她的眼睛代替她去好好看她眼中的世界。
我睜著剛複明的雙眼,淚如雨下。走上街頭,一切的一切都那麼熟悉,只是所有男人的
頭頂都多了一個字,要不是“攻”,要不是“受"。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.173.27.213
※ 文章網址: http://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1411222955.A.7E1.html
※ 編輯: chrisos (218.173.27.213), 09/20/2014 22:31:42
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: chrisos (218.173.27.213), 09/20/2014 22:40:40
※ 編輯: chrisos (218.173.27.213), 09/20/2014 22:43:59
※ 編輯: chrisos (218.173.64.178), 09/21/2014 01:50:53
1F:推 A83X8CJ8: 一個是針對bit改,一個是針對整個byte改,兩種改的方式 09/21 09:14
2F:→ A83X8CJ8: 都是改同樣的位置。然後你是不是沒宣告變數啊?這個unio 09/21 09:14
3F:→ A83X8CJ8: n宣告完只是一個格式而已 09/21 09:14
4F:推 A83X8CJ8: 你看到xxxxx_t就表示這個是自定義的結構(?) 不而是變 09/21 09:16
5F:→ A83X8CJ8: 數 09/21 09:16
6F:推 A83X8CJ8: 說錯請別介意XD 09/21 09:20
7F:→ chrisos: 的確是我沒宣告UNION的變數,增加了後就可以針對整個BYTE 09/22 16:10
8F:→ chrisos: 做修改了,看來是我沒有清楚UNION的用法,謝謝您。 09/22 16:10