• ベストアンサー

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

  • 4bitデータを変更して出力させるプログラム

    分かりにくいタイトルですみません。 PICに入力された4bitのデータを、違う4bitのデータにして出力させるプログラムを作りたいのですが、 いろいろなサイトを探してもそのような記事が無くて困ってます。 下記のような動作をするプログラムをご教示ください。 言語はアセンブラ 使用マイコン:PIC16F88 内部オシレーター使用 ポートAを4bit入力用 ポートBを4bit出力用 ポートAの入力が       ポートBの出力では ・LLLL             ・LLLL      ・HLLL             ・LHLL ・LHLL             ・LLHL ・HHLL             ・HLHL ・LLHL      の時    ・HHHL ・HLHL             ・LLLH ・LHHL             ・LHLH ・HHHL             ・HHLH ・LLLH             ・LLHH ・HLLH             ・HLHH このような動作です。 使用目的は簡単に書くと、自作のサラウンドプロセッシングアンプのチャンネルテストという機能のメイン制御用に使います。ロジックICでもできますが、とてつもなく部品点数が多くなってしまうので、マイコンで制御したいと思います。 暇な時でも良いのでよろしくお願いします。

  • 【PICマイコン】一般製品にPICシリーズが使われてるって本当ですか?

    最近PICをはじめて大分アセンブラもなれてきて楽しめるようになってきました。 それで教えてGOOで色々見てるときにPICシリーズのマイコンは一般製品の中にも組み込まれているって書いてあったんですが本当ですか? 僕の中でPICやAVR等はそれなりにコアな趣味を持つ人たちのおもちゃ的な物だと思ってました。 もし本当に入ってるんだったら具体的にどんな製品にどのマイコン(例PIC16F877A等)が使われてるのか教えてください。凄く興味があります。 また、何処のサイトだったか忘れましたが「これからマイコンをはじめるならAVR!PICをやるメリットなし!」ぐらいの勢いで書いてあったんですがその通りなんでしょうか? もひとつ、、PICの勉強をはじめるときにアセンブラかCかで迷ったんですがアセンブラではじめた方がCPUの構造をより理解しやすいとの事でアセンブラで進めてきたんですが、いまいちその実感がわきません。具体的にどういう所でCPUの構造を理解しやすいのでしょうか? それっぽいなぁと思うのはクロックでタイミングを与え、そのタイミング毎に命令を実行しレジスタのBITで条件判断をしたり計算をしたりしてポートに出力する的な部分でしょうか?そもそもCPUの構造ってどういう事なんでしょうか?何て言うか例えて言うならエクセルは仕事で使うから詳しいけどWindowsの設定は全然解りませんみたいな感じです。 よろしくお願いしますm(_)m

  • PICマイコンのプログラムカウンタの操作法は?(C言語)

    HI-TechのPICC PRO 9.65を使ってPIC16F877Aのプログラミングをしています。 しかし、最近マイコンの動作が不安定になり、突然プログラムが暴走したりするので、プログラムカウンタに問題があると疑っています。 昔、アセンブラでプログラムしていた頃はPCLATHに書き込んでからPCLに書き込んだり、ORG命令などで対処していましたが、今回初めてPICCを導入したので対処の仕方がわかりません。 またCコンパイラによっては自動でPCLATHを繰り上げてくれるようなのですが、PICCの場合はどうなのでしょうか。 hexを除いてみると0x0800のあたりもびっしりコードでうまっているのですが。。。 ちなみに asm("ORG 0x0800"); などのようにC言語の中にアセンブラで記述してもうまく解決できませんでした。 PCLATH = PCLATH + 0b000?????; とか色々やってみたのですがだめでした。 そもそもヘッダやインクルードの内容がどの番地に書き込まれているかを調べる良い方法はないでしょうか。 1.PICCはPCの操作を自動でやってくれているのか 2.もしそうでなければどのようにして解決すればよいのか で宜しくお願い致します。

  • 8bitの2進数を入力して2つのポートに(PIC)

    8bitの2進数を入力して2つのポートに出力させる方法 PIC16F886のポートAに8bitの2進数を入力したとします。 そのとき ポートAの入力が   ポートBの出力では  ポートCの出力では ・LLLLLLLL        ・LHHHLHLH   ・HLHLLHLH ・LLLLLLLH   のとき ・LHLLHHHH   ・LHLHLHLH          ・          ・          ・ ・LLLLLLHL        ・LHHLLLLH   ・HLHHHHH ポートAに入力された2進数を変更して、ポートB、ポートCに 出力させて、1チップで14セグメントLED(英数字表示器)を点灯させたいです。 このような動作は可能なのでしょうか?

  • PICで入力ポートの内容を出力ポートにコピーしたい

    PICのプログラムをアセンブラで組んでいるのですが、 どうにもシンプルな書き方ができなそうなのでお知恵をお貸しください。 例えば、 ポートAが入力、それ以外のポートは出力になっているとします。 ・ポートAの0番のオンオフを、ポートBの2番へコピー出力。 ・ポートAの1-3番のオンオフを、ポートCの4-6番へコピー出力。 という感じで、Aのオンオフ状況を、各出力ポートにコピーするということをしたいです。 どのようにしたらスマートに書けるでしょうか? ちなみに各出力ポートに関して、コピーする前に一旦全てオフにする、 というようなことはできません。

  • PICによるLED制御について

    大学の講義でPICのLED制御の課題がよくわかりません。 どなたか教えていただけないでしょうか? [問]  PIC16F84Aにおいて、動作を実現するプログラムを示せ。  メインルーチンでLED出力の点燈箇所を1秒ごとに巡回させる。   RA3=Low(OFF)のとき、左向きに巡回シフト(RLF命令)させる。   RA3=High(ON)のとき、右向きに巡回シフト(RRF命令)させる。  また割り込みルーチンによって、RA0~RA2の3ビットの値に応じて  点灯速度を変化させる(値が大きいほど速く)  ただし、ポートAは全て入力モード、ポートBはRB0以外を出力モードとし(RB0は割り込み用)、ポートBの初期出力を0000100*(LED出力の初期点燈位置は第3ビットのみ)とせよ。

  • PICを使って正弦波を出力

    PIC16F84Aを使って、正弦波を出力したいのですが、プログラミングまたは回路のほうはどのように組めばよいのでしょうか。 欲しい正弦波の周波数は0.3[Hz]、使用言語はアセンブラです。 よろしくお願いします。

  • PICアセンブラで10進数を2進数に変換するプログラムを教えて欲しい

    10進数のデータを7セグLEDで表示させたいのですが、まずは2進数にしないと表示出来ないみたいなので色々インターネットで調べているのですが、残念ながらPICアセンブラ言語ではどこにもそれに関わるものが掲載されていません。 どなたか教えてもらえないでしょうか。

  • PICプログラム C言語とアセンブラ言語

    PIC18シリーズを使用して、プログラミングをしています。コンパイラはCCS-Cです。今まではすべてC言語で書いてきたのですが、アセンブラでしか設定ができない部分があり、今までのC言語のソースに加えてアセンブラを組み合わせようと思っているのですが、C言語とアセンブラを組み合わせることは可能なのでしょうか?

  • PICに書き込むプログラムや変数の容量を少なくする方法

    16f877のpicマイコンでプログラミング作業を行っています もともとPC上でのソフト開発がメインだったので マイコンプログラムはいろいろ制約があり大変です 現在C言語によってプログラムを書いているんですが ccscでコンパイルすると容量不足でエラーがでます not enough ram for valiaホニャララ 等がよく出ます。 マニュアルを読むと変数を減らせとかいろいろ書いてありますが 減らしても改善できません。 知人に聞くとアセンブラで書くといいよと言われましたが アセンブラはわからないのでCじゃないとだめです なにか容量をあまり取らないコーディングやその他のテクニックをご存知の方 教えてください、お願いします。 また、参考になる書籍やURL等がありましたら教えてください