• ベストアンサー

PICのプログラムカウンタについて

プログラムカウンタでポートAに4bitの2進数を入力して、変換された2進数のデータをポートBに出力させることはできたのですが、 ポートCにも違うデータを同時に出力させたいのですが、どういった命令文を作ったらいいでしょうか? 例えば、ポートAが「HLHL」の入力の時にポートBでは「HLLH」、ポートCでは「LLHL」を出力させる方法です。 言語はアセンブラ、マイコンはPIC16F886です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • uruz
  • ベストアンサー率49% (417/840)
回答No.3

プログラム・カウンタを操作しRETLW命令で変換する方法ではテーブルがプログラムを兼ねていますからテーブル・アドレスをパラメータとするサブルーチン化はプログラムをややこしくするだけです。ご存じとは思いますがPICはアセンブラではプログラム・メモリにデータ・テーブルを記述できますが、そのデータ・テーブルにアクセスする方法が用意されていません。そこで裏技的にRETLW命令で実現するわけですがテーブル・アドレスをパラメータとするサブルーチン化は現実的では無くなります。 PICでデータ・テーブルを扱う唯一の方法はデータ・テーブルをEEPROMエリアに置くことです。 EEPROMの使い方は自分で調べてください。

その他の回答 (2)

  • uruz
  • ベストアンサー率49% (417/840)
回答No.2

>ここからどうプログラム良いでしょうか? >良かったら教えてください 質問の要点が解りません! 最初の質問で >変換された2進数のデータをポートBに出力させることはできた と書かれてます。出力ポートがCになっただけで解らなくなるのでしょうか? 変換手順はポートB出力の時と同じです、出力先がBからCになっただけです。何が解らないの?

hatsune1
質問者

補足

少し日本語おかしかったです。正しくは、 >ここからどうプログラムを編集したら良いでしょうか? です。誤解与えてすみません。 >変換用のテーブルを使用して変換しているならポートB用とポートC用のテーブルをする必要があるでしょう。 と仰っているので、補足欄にポートB用とポートC用のテーブルを載せました。 変換用のテーブルのアドレスのサブルーチン化する方法が分からないです。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.1

まず、プログラムカウンタとはプログラムの実行アドレスを保持しているレジスタの名称です。 「PICのプログラムについて」 「プログラムでポートAに......」と読み替えてお答えします。 ポートBに対して行ったような処理をポートCに対しても行えば良いだけです。 変換用のテーブルを使用して変換しているならポートB用とポートC用のテーブルをする必要があるでしょう。 変換用のテーブルの先頭アドレスをパラメータとしてサブルーチン化すればプログラムを共有できます。 >データを同時に出力させたい ここで言う「同時」がどの程度なのか? 違うポートに出力すのですからポートB出力→ポートC出力で最低2命令分(8クロックサイクル)の時間差が発生します。 この差が許容されないのならばポートを別けずに同じポートの下位4bitと上位4bitに出力すれば同時出力ができす。 どうしてもポートBとポートCでなければならず、かつ同時出力が必要ならラッチやDフリップフロップなどを使用した外部回路が必要になります。

hatsune1
質問者

補足

ありがとうございます。 14セグメントLEDという英数字も表示できるセグメントLEDを購入したので、PICで点灯させようと計画してますが、プログラミングの部分でてこずってます。 以下のようにポートB用とポートC用のテーブルを作りました。 ここからどうプログラム良いでしょうか? converter_A movf PORTA,W andlw B'00111111' ; PORTAのRA0~RA5の値だけを参照する addwf PCL,F RETLW B'11011011' RETLW     B'01010010' RETLW       B'10110110' ・・・・ converter_B movf PORTA,W andlw B'00111111' addwf PCL,F RETLW       B'11111011' RETLW     B'00011111' RETLW       B'10111011' ・・・・ END 良かったら教えてください

関連するQ&A