PORTA = 0xFF; とするとポートAから出力出来ますが、
RA0,RA1,RB0,RB1をPORT=0x??という風に記述し出力したいのですが、どのようにプログラムを組めば良いのか教えて下さい。
(コンパイラはHI-TECH Cを使ってます)
絵の様な構造体を作って、共用体を使えば良いのかな?
と思って試行錯誤しましたが、
理解不足なのか、うまくプログラミング出来ませんでした。
一般的な方法では
一度 unsigned char 型の変数にPORTAの値を読み込む
unsigned char a;
a = PORTA;
特定のBITを立てる(ONする)場合はOR,BITをOFFする場合は反転してANDをとります。
0bit目をONする
a = a | 0b00000001;
2bit目をOFFする
a = a & 0b11111011;
結果をPORTAに書き戻します。
PORTA = a;
マイコンのポートのBITが入力BITの場合は書いても意味がないですし、出力BITの場合は前回出力した値が読み出せるかどうかはマイコン依存です。
その為、ポート毎にあらかじめ変数を用意しておいて、それに対して上記を行うと良いと思います。
#define PA0 0b00000001 #define PA1 0b00000010 #define PA2 0b00000100 #define PA3 0b00001000 #define PA4 0b00010000 #define PA5 0b00100000 #define PA6 0b01000000 #define PA7 0b10000000 static unsigned char porta; //PORTA,portaの初期化 porta = 0; PORTA = porta; //portAの2bitをON porta |= PA2; PORTA = porta; //protAの4bitをOFF porta &= ~PA4; PORTA = porta;
コンパイルしていないので動くかどうかわかりませんが、イメージはこんな感じです。
共用体を使う場合はヘッダファイルが参考になるかもしれません。
C:\Program Files (x86)\HI-TECH Software\PICC\9.83\include\pic16f84a.hのPORTAの定義は以下になります。
// Register: PORTA volatile unsigned char PORTA @ 0x005; // bit and bitfield definitions volatile bit RA0 @ ((unsigned)&PORTA*8)+0; volatile bit RA1 @ ((unsigned)&PORTA*8)+1; volatile bit RA2 @ ((unsigned)&PORTA*8)+2; volatile bit RA3 @ ((unsigned)&PORTA*8)+3; volatile bit RA4 @ ((unsigned)&PORTA*8)+4; #ifndef _LIB_BUILD volatile union { struct { unsigned RA0 : 1; unsigned RA1 : 1; unsigned RA2 : 1; unsigned RA3 : 1; unsigned RA4 : 1; }; } PORTAbits @ 0x005; #endif
HI-TECH Cの癖は知らないのでヒントだけですが…。
(1)data latch機能の無いPICの場合
文字型の変数xを用意しておいて、
変数xに対してビット演算を行い、
変数xをポートに出力する。
(2)data latch機能の有るPICの場合
ポートに対してビット演算を行い、出力する。
秋月通商のサイトにデータシートがありますね。
(ファイル名は877ですが87Xも載ってます)
http://akizukidenshi.com/download/ds/microchip/PIC16F877.pdf
29ページを見るとDataLatchを搭載していますので(2)になります。
私の回答には大きな間違いがありましたので合わせて訂正します。
(1)data latch機能の無いPICの場合
文字型の変数xを用意しておいて、
ポート出力前に変数xに値をコピーして置いておきます。
ポート出力後に変更を加えたい場合は、
変数xに対してビット演算を行い、
変数xをポートに出力するという手順を踏みます。
(2)data latch機能の有るPICの場合
すでに回答No.2で頂戴しているように、
ポートの状態を変数に格納→変数にビット演算→ポートに出力という流れになります。
寝ぼけた回答で惑わせたこと、誠に申し訳なく思います。
すみません。
data latch機能ありましたね。(この機能良く理解してませんでした。)
回答No.2の方もそうですが質問の内容がうまく伝わってない様な気がします。
(私が回答を理解出来ていないのかもしれませんが,,,)
お二人が書かれている内容は、portの基本操作方法で、私の質問はportA,portBの特定ビット(例えば、RA0,RA1,RB0,RB1)を一つの命令で実行したいのです。
PORT = 0b1111;の様に。
一般的な方法では
一度 unsigned char 型の変数にPORTAの値を読み込む
unsigned char a;
a = PORTA;
特定のBITを立てる(ONする)場合はOR,BITをOFFする場合は反転してANDをとります。
0bit目をONする
a = a | 0b00000001;
2bit目をOFFする
a = a & 0b11111011;
結果をPORTAに書き戻します。
PORTA = a;
マイコンのポートのBITが入力BITの場合は書いても意味がないですし、出力BITの場合は前回出力した値が読み出せるかどうかはマイコン依存です。
その為、ポート毎にあらかじめ変数を用意しておいて、それに対して上記を行うと良いと思います。
#define PA0 0b00000001 #define PA1 0b00000010 #define PA2 0b00000100 #define PA3 0b00001000 #define PA4 0b00010000 #define PA5 0b00100000 #define PA6 0b01000000 #define PA7 0b10000000 static unsigned char porta; //PORTA,portaの初期化 porta = 0; PORTA = porta; //portAの2bitをON porta |= PA2; PORTA = porta; //protAの4bitをOFF porta &= ~PA4; PORTA = porta;
コンパイルしていないので動くかどうかわかりませんが、イメージはこんな感じです。
共用体を使う場合はヘッダファイルが参考になるかもしれません。
C:\Program Files (x86)\HI-TECH Software\PICC\9.83\include\pic16f84a.hのPORTAの定義は以下になります。
// Register: PORTA volatile unsigned char PORTA @ 0x005; // bit and bitfield definitions volatile bit RA0 @ ((unsigned)&PORTA*8)+0; volatile bit RA1 @ ((unsigned)&PORTA*8)+1; volatile bit RA2 @ ((unsigned)&PORTA*8)+2; volatile bit RA3 @ ((unsigned)&PORTA*8)+3; volatile bit RA4 @ ((unsigned)&PORTA*8)+4; #ifndef _LIB_BUILD volatile union { struct { unsigned RA0 : 1; unsigned RA1 : 1; unsigned RA2 : 1; unsigned RA3 : 1; unsigned RA4 : 1; }; } PORTAbits @ 0x005; #endif
通常は関数を組んで処理するかな。
struct portbits{
unsigned RA0 : 1;
unsigned RA1 : 1;
unsigned RB0 : 1;
unsigned RB1 : 1;
};
volatile union {
struct portbits;
char byte;
} port @ xxxxx ;
共用体というのはあくまで同じ変数を別の型の変数として処理するものだから、上記の書き方には無理があります。
そうですか。
共用体について理解不足だったようです。
勉強していろいろ試してみます。
ありがとうございました。
通常は関数を組んで処理するかな。
共用体というのはあくまで同じ変数を別の型の変数として処理するものだから、上記の書き方には無理があります。
2012/10/31 08:53:15そうですか。
2012/11/01 19:23:28共用体について理解不足だったようです。
勉強していろいろ試してみます。
ありがとうございました。