1351266486 PICマイコンの出力関数を作りたいです。

PORTA = 0xFF; とするとポートAから出力出来ますが、
RA0,RA1,RB0,RB1をPORT=0x??という風に記述し出力したいのですが、どのようにプログラムを組めば良いのか教えて下さい。
(コンパイラはHI-TECH Cを使ってます)

絵の様な構造体を作って、共用体を使えば良いのかな?
と思って試行錯誤しましたが、
理解不足なのか、うまくプログラミング出来ませんでした。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/11/01 19:21:40

ベストアンサー

id:garyo No.2

回答回数1782ベストアンサー獲得回数96

一般的な方法では
一度 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
他3件のコメントを見る
id:garyo

通常は関数を組んで処理するかな。

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
id:Aluminium

そうですか。
共用体について理解不足だったようです。
勉強していろいろ試してみます。

ありがとうございました。

2012/11/01 19:23:28

その他の回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

HI-TECH Cの癖は知らないのでヒントだけですが…。
 
(1)data latch機能の無いPICの場合
 
文字型の変数xを用意しておいて、
変数xに対してビット演算を行い、
変数xをポートに出力する。
 
(2)data latch機能の有るPICの場合
 
ポートに対してビット演算を行い、出力する。

他1件のコメントを見る
id:windofjuly

秋月通商のサイトにデータシートがありますね。
(ファイル名は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で頂戴しているように、
ポートの状態を変数に格納→変数にビット演算→ポートに出力という流れになります。

寝ぼけた回答で惑わせたこと、誠に申し訳なく思います。

2012/10/27 10:41:24
id:Aluminium

すみません。
data latch機能ありましたね。(この機能良く理解してませんでした。)

回答No.2の方もそうですが質問の内容がうまく伝わってない様な気がします。
(私が回答を理解出来ていないのかもしれませんが,,,)
お二人が書かれている内容は、portの基本操作方法で、私の質問はportA,portBの特定ビット(例えば、RA0,RA1,RB0,RB1)を一つの命令で実行したいのです。

PORT = 0b1111;の様に。

2012/10/27 11:20:09
id:garyo No.2

回答回数1782ベストアンサー獲得回数96ここでベストアンサー

一般的な方法では
一度 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
他3件のコメントを見る
id:garyo

通常は関数を組んで処理するかな。

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
id:Aluminium

そうですか。
共用体について理解不足だったようです。
勉強していろいろ試してみます。

ありがとうございました。

2012/11/01 19:23:28
  • id:Lovin
    PICを使ったことがないので動作するかはわかりませんが、
    PORTA~Eまでは連続したアドレスなので、

    volatile unsigned short PORT @ 0x005;

    と宣言してみてはいかがでしょうか。
    普通こういうコーディングはしないと思いますけど。
  • id:Aluminium
    Lovinさん、ありがとうございます。
    なるほど。理解出来ました。


    でもちょっとイメージと違うかなあという感じです。
  • id:Aluminium
    みなさまご協力ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません