人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

1351266486
●拡大する

●質問者: アルミ
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど

HI-TECH Cの癖は知らないのでヒントだけですが…。

(1)data latch機能の無いPICの場合

文字型の変数xを用意しておいて、
変数xに対してビット演算を行い、
変数xをポートに出力する。

(2)data latch機能の有るPICの場合

ポートに対してビット演算を行い、出力する。


アルミさんのコメント
回答ありがとうございます。 PIC16F87Xを想定すると、出力の場合は(1)だと思うのですが、 ちょっとこのヒントだけでは理解出来ませんでした。

うぃんどさんのコメント
秋月通商のサイトにデータシートがありますね。 (ファイル名は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;の様に。

2 ● garyo
ベストアンサー

一般的な方法では
一度 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 {
 unsignedRA0 : 1;
 unsignedRA1 : 1;
 unsignedRA2 : 1;
 unsignedRA3 : 1;
 unsignedRA4 : 1;
 };
} PORTAbits @ 0x005;
#endif

アルミさんのコメント
回答ありがとうございます。 ちょっと欲しい回答と違う気がします。 ヘッダファイルは見たのですが、最後から2行目のPORTAbits @ 0x005; の指定方法が思いつかなかったです。 >|| //bit and bitfield definitions volatile bit RA0 @((unsigned)&PORTA*8)+0; volatile bit RA1 @((unsigned)&PORTA*8)+1; volatile bit RB0 @((unsigned)&PORTB*8)+0; volatile bit RB1 @((unsigned)&PORTB*8)+1; struct portbits{ unsigned RA0 : 1; unsigned RA1 : 1; unsigned RB0 : 1; unsigned RB1 : 1; }; volatile union { struct portbits; char byte; } port @ xxxxx ; ||< 最後 @ xxxxx;にアドレスを入れると思います、RBポートの制御も含まれるので書きようがありません。

garyoさんのコメント
PORTA,PORTBに同時に出力したいというこであれば、コメント欄でLovinさんが書かれている以下を試してみると良いと思う。 volatile unsigned short PORT @ 0x005;

アルミさんのコメント
ありがとうございます。 これだと、A,B両方出来そうですね。 でも、ちょっとイメージと違います。 PICって、出力に使えないピンがあるじゃないですか。 それを意識しないで良い様に、欲しいピンを一括りにしてプログラム出来ないかなあと思っています。

garyoさんのコメント
通常は関数を組んで処理するかな。 >> struct portbits{ unsigned RA0 : 1; unsigned RA1 : 1; unsigned RB0 : 1; unsigned RB1 : 1; }; volatile union { struct portbits; char byte; } port @ xxxxx ; << 共用体というのはあくまで同じ変数を別の型の変数として処理するものだから、上記の書き方には無理があります。

アルミさんのコメント
そうですか。 共用体について理解不足だったようです。 勉強していろいろ試してみます。 ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ