• ベストアンサー

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.もしそうでなければどのようにして解決すればよいのか で宜しくお願い致します。

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

  • ベストアンサー
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.3

1.PICC(コンパイラ)はPCの管理を行いません。 2.暴走の原因を最近プログラミングしてしまったものと見受けられます。 PIC16Fxxxのアーキテクチャの問題ですが、内部にPC用の専用スタック(LIFO)が存在します。 アセンブラ上でCALL(関数呼び出し)が発生した場合、現状のPCカウント値を専用スタックへPUSHし、return命令時に自動でPOPします。 但し、このスタックはデバイスに拠りますがリングバッファとして大概8層程度しかありませんので、PICCを使って関数コールを8層以上掛けた場合容易に上書きされてしまいます。 C言語上で確認が可能です。関数コールを連続してスタック数以上呼んでいませんか? 正確なPCスタック数はMicrochipのサイトからデータシート内の記述で確認が可能です。 問題部の記述が無いので憶測ですが、知らずに使うと簡単に暴走する部分ですので。たぶんココじゃないかなぁ?

d3msk8j
質問者

お礼

遅くなりました、ありがとうございます。 PIC16F877Aのスタックは物理的に8層までです。アセンブラのときは8層も使わなかったためスタックのことはすっかり忘れていました。ありがとうございます。 本日シミュレーターで1ステップずつ確認してみましたが、0x0000番地に急に飛んでしまうという問題の箇所に差し掛かるまでに、”C言語の関数は”3~5層しか呼んでいませんでした。 ですがコンパイルされたアセンブラリストを見ると、どうもひとつの関数のために何度かcall命令が生成されているので、C言語としては3層でもアセンブラ上では8層を超えている可能性がありそうです。。。正確に何層かは簡単には数えられなさそうです。 ちなみにMPLAB-IDEでは、C言語としてのスタック数はメニューからView-HardwareStackでみれたのですが、アセンブラのスタック数を見られるはずのView-CallStackのとこはなぜか灰色でクリックできません。なので明日かあさってにはなんとか手動で数えてみます。 これで数えてみてもし9層目をcallしていたらbug_bugさんには非常に感謝しなければいけないですね。。。ありがとうございます。調べるので少々お待ちください。 あと参考程度なのですが、0x0000番地に急に飛んでしまうという問題の箇所が、アセンブラリスト上では実は 2000 (CALL 0) となっていることがわかりました。そのまますぎて笑えるのですが、「call 0」とかいうこんな明らかに間違っているコンパイルをするというのは、無理に9層目をcallしようとして起きたという理解でいいんでしょうか。? このようなことを何か経験された方がいらっしゃったら引き続き教えてください>< もう表題と関係ないのでスタック数のことが正式に解決しましたら質問し直します。 bug_bugさんありがとうございました。

d3msk8j
質問者

補足

アセンブルリストで何層スタックしているかを数えてみましたが、0x0000番地に急に飛んでしまう問題の箇所ではスタックは全くオーバーフローしていませんでした。 そのかわり、0x0000番地に飛んだときにスタックはリセットされないままですので、プログラムの2周目か3周目でオーバーフローしていることがわかりました。 つまりなぜ”CALL 0”という変な命令が生成されてしまったかを解決しないといけないようです。

その他の回答 (3)

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.4

call 0 がコンパイラによって生成されるとは考えにくいので、MPLAB上の逆アセンブルリストを参照しているのであればconst値などのデータセクションにPCが飛んでしまっているのかもしれません。 逆アセンブルリストでプログラムROM上のアドレスさえ確認できれば、.mapファイルを参照し何が格納されているのか確認できますね。 仕様が不明なのでちょっと解答は難しいですが、割り込み発生時や、割り込み処理での要因別ブランチの関数コールなどでもPCスタックは行われるので注意が必要です。 とりあえず思いつくトコだけ・・・。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

C18やC30は、PIC16Fでは使えません。 他のコンパイラだと「SDCC」とか「CCS C/PCM」とか「FED-C」とかでしょうか。 c2cと言うのもあるみたいですが、Linux版のみ無料のようです。 http://ww2.tiki.ne.jp/~maro/old/PIC/C2C/ と思ったらc2cは入手不能になってました。 私は16F84しか書いたことないのでPCLATH対応については未知ですが、上記のc2cのアセンブルリストを見る限りは他のコンパイラでも対応している可能性が有ります。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

PICCには詳しくないんですが、とりあえずPC系の誤動作を疑うならアセンブルリストを取ってコードを確認してみてはどうでしょうか。 PICC-LITEと同じなら-ASMLISTで取れると思います。 実際上のメモリの配置アドレスは、リンカでマップファイルを作成する必要があります。調べてみてください。 なんにしても無理やりPCLATHを変更するのはC言語として矛盾が生まれるで無理があると思います。

d3msk8j
質問者

お礼

ありがとうございます。 アセンブルリストというものを知りませんでした。。。 いい忘れてましたがPICCはMPLABIDEと統合して使っていましたので、探してみたところMPLABのViewメニューのDisassemblyListingで見れました。 これでどの番地にどの関数が書いてあるか一目でわかりました、ありがとうございます。 で早速問題を調べてみましたが、シミュレータで見てみてもやはりreturn命令などの後にいきなり0x0003番地に戻されたりしているのでPC関連の問題な気がします。しかしどう対策するのかわかりません。。。 マップファイルやらでメモリの配置を触ったところで解決できる自信がありませんが一応今調べてみています。一応それぞれの関数はページをまたがない様に配置してくれていました。 あきらめてC18やC30に移行してみたくなっていますがこれらはPCの問題はないのでしょうか。。。

関連するQ&A

  • PICマイコンでC言語のデバッグ方法

    PIC 16Fでアセンブラでソフトを作っていたのですが、C言語でソフトを作りたいと思っています。開発用ソフトはMAPLABーXーIDEとCコンパイラはXC8を使います。 アセンブラでは、シミュレータモードでステップ動作ができたのでわかりやすくデバッグできたのですが、cではステップ動作の様なことができるのか、できない場合はどうしたらよいか教えてください。

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

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

  • PICライタ (C言語→HEXファイル)

    今PICライタについて独学で勉強しています。 今ソフト的には秋月のPICライタおよび、MPLAB使ってます。 しかし、MPLABがC言語読み込めないため迷っています。 そこで質問なんですが (1) C言語をアセンブラ言語に変換する無料ソフトありますか? (2) (1)をあきらめたとしてアセンブラ言語で書くとして、アセンブラ言語でPICのプログラム書くための、わかりやすい本などご存知ですか? やっぱりCコンパイラを買うしかないのでしょうか??

  • C言語でPICのプログラムをしたいんですが。

    PICをC言語でプログラミングしたいと思っているんですがよくわかりません。 PCの画面に「Hello」とか出すことはできるんですが、PICで動作するCがわかりません。 LEDの点灯(点滅でも)やモーターを動作させたりするプログラムを書きたいんですが イマイチ良く分からず最初の定義文の構成とかもPICだとやっぱり違うのかなって 思っているんです。普通のCですら定義文や構成の意味が微妙な感じ何です。 でもCでかけたらカッコいいなって思ってます。 PICのCに関する入門みたいなサイトや文章があったら教えて下さい。 アセンブラやJAVAについても教えていただくとありがたいです。 まぁでもC言語メインでお願いします。

  • PIC C言語でコード開始アドレスを指定する方法

    PIC18F2550用にMPLAB-IDEでC18コンパイラを使って、作ったファイルをUSB経由でブートしようとしています。下位番地にはブートローダが入っているため、プログラムの開始アドレスを800番地以降におきたいのですが、例えばアセンブラ言語のORG命令のようにコードの開始番地を指定することはできないでしょうか?

  • PICマイコンを使用した赤外線簡易リモコン

    PIC16F84Aを使って作れる赤外線リモコンの回路とプログラムを教えてください。赤外線の送受信部分の処理がよくわかりません。動作としては簡易的な物で十分ですTTLレベル出力で2チャンネルほどコントロールできればいいです。コンパイラはCCS社のCコンパイラです、アセンブラ(MPASM)でも結構です、PICを使用した電子工作の経験はあります。 よろしくお願いします。

  • PICマイコンでPN9符号生成(C言語)

    PICマイコンでC言語を用いてPN9擬似ランダム符号発生器を作成したいのですが、WEBで検索してみてもディスクリートでの作成方法や、理論的な解説、アセンブラのソースしか見つからず、作業が滞っている状態です。 参考ですがPICはPIC24FJ64GA002,004,PIC24FJ32GA002などで、コンパイラはMICROCHIP C30 を使っています。 上記のマイコン用のソースではなくても構いませんので、PN9符号擬似ランダム符号を生成する C言語のソースを教えて頂けないでしょうか。  また参考となるソースが載っているHP、書籍などの情報でも助かりますのでよろしくお願い致します。

  • PIC・AVRのC言語の初心者無向け勉強・参考本

    まずカテゴリーがコンピュータのC C++になっていますが、PIC・AVRもこのカテゴリーで良いのか分からなかったので、間違いでしたらご指摘下さい。 PIC・AVRのC言語の初心者無向け勉強・参考本・シンプルなフリーコンパイラをご紹介頂きたく思います。 現在PICは、ほとんどがPIC Basic Proでプログラミングしています。 あとは、フリーで公開されているアセンブラ(ASM)をNotepadで自分の仕様に修正してコンパイルしています。 しかし、PIC24Fシリーズ以降はPIC Basic Proは対応しておらず、フリーで公開されているプログラムのほとんどがC言語です。 一様、PIC24Fシリーズが出た頃にHI-TECH C CompilerとPIC-Cで試しにコンパイルできるかやって見たのですが、多分設定の段階でミスってしまい再インストールやバージョンを変えても、上手くコンパイルできません。 その後、放置していたので今現在は試用期間切れになってしまっています。 AVRの方は(Arduinoが周辺キットが豊富みたいですが・・・)、 一様ライティング機器としてAVRISP mk2を購入しAVR Studio 6.1をインストールしてありますが、PICマイコン同様C言語は初心者で、自分でプログラムを書くことが出来ません。 また、PICとの使い勝手の違いからハード・ソフトの準備は出来ているものの、現状は宝の持ち腐れに近い状態です。 フリーで公開されているHEXファイルを書き込む程度にしか使ってません、多少の使用環境の違いの修正も、AVRの方も上手くいきません。 勉強不足・学力不足と言わざるを得ません。 長々と前置きを書いてしまいましたが本題です。 PICとAVR各々に特化したC言語の初心者向けの本を色々教えて下さい。 書店でC言語の本を探すとWindows用がほとんどで、「C言語ではじめるPICマイコン」みたいなタイトルの本を立ち読みしても、いまいちピンときません。 (AVR・Arduinoも同様です。) また、ソフトの方は出来る限りフリーソフトでシンプルで、HI-TECH C Compiler・PIC-C・AVR Studioみたいな開発環境向けソフトでなく、インストール後はドラッグ&ドロップするだけで、C言語ファイル(AVRの方はASMファイル用も)をコンパイルできる物を教えて下さい。 ※ 開発環境の機能の無い物ってのは都合良すぎるでしょうか?? 何卒ご教授のほど宜しくお願い致します。 m(_ _)m ※※※※※※※※※※※※ テスト用・実用的プリント基板の作製は、それなりの物を取り揃えておりますので、ご心配なさらずに・・・・ でも、こんな基板があると動作確認などに重宝しますと言った情報は大歓迎です。 (市販品・自作可能なプリント基板情報などなど)     

  • PIC18のCコンパイラはどちらがお勧めでしょうか?

    PIC18のCコンパイラはどちらがお勧めでしょうか? MPLAB C Compiler pic18MCU と HI-TECK C PIC18MCU (どちらもLiteバージョンで) 又製品版を使うとしたらどちらがいいのでしょうか?

  • MPLAB C18のC言語について

    趣味でPICをはじめて、いままではアセンブラ言語でプログラムを書いてきました。 こんどPIC18Fに挑戦しようと思っているんですが、PIC18FはC言語で書いた ほうがいいらしいですね。無料でMPLAB C18というC言語のコンパイラが使えるらしいですし。 C言語は勉強したことがないので、とりあえずC言語を勉強しなければならないんですが、 C言語っていろいろ種類があるんですね。C,C++,C#、あとvisual basic系のCとか。 なんだかさっぱりわかりません。 MPLAB C18のC言語にもっとも近いのはどれでしょうか。おしえてください。

専門家に質問してみよう