• ベストアンサー

マイコンのCプログラミングで未使用のプログラム領域のアドレスを指定して読み込みできる?

いまPICマイコンのプログラミングをしています。コンパイラはCSSというものを使っています。 設定した値を読み込んでその値でタイマーを動かそうと思っているのですが、12F509というマイコンはEEPROM領域がないので、なんとかしてこれを実現するにはと思い2kワードのプログラミング領域を半分くらいしか使っていないことに気づいたので、その領域の一番後ろの0x07FF番地に何かしらデータを書いてその番地にアクセスしてそこからタイマーの時間を呼び出そうと思ったのですが、このようなことはできるのでしょうか? C言語だとポインターを使えばよかったと思うのですが、その場合どのように書いたら良いのでしょうか? ご教授よろしくお願い致します。 たぶん、 unsinged char *timer_add; timer_add = (unsigned char *)0x07FF; get_value = timer_add; これでよかったでしょうか?

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

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

アドレスを直接書いて、アクセスする方法も上記回答のとおり 直せばいけますが、もともと const でデータ定義すれば 済むように思います。 以下 CCSコンパイラの仕様です。 ノート:CCSのconst(定数)修飾子は常にデータがプログラム・メモリーに置かれることを意味し、そのデータは `読取専用`です。これはconst(定数)修飾子が単純に `読取専用`としているANSI定義には従っていません。

maeken0012
質問者

お礼

回答ありがとうございます。 CCSのマニュアルを読み直してみたら、確かにプログラム領域にデータを書く方法というのが載っているんですね。そこで下のようなプログラムを書きました。 #ORG 0x07F0, 0x07FC CONST CHAR ID[2]= {0x55,0x66}; このようにしたら、0x07F1,0x07F2番地に0x55,0x66を書いてくれました。シミュレーションでWatchでID[1],ID[2]にはそれぞれに緑の文字で”P”という文字が入っていてアドレスも”7F1”、”7F2”となりました。 最初に私がこれならできるかなと思い、つっこみを入れていただいて修正した unsinged char *timer_add; timer_add = (unsigned char *)0x07FF; get_value = *timer_add; このプログラムだと、WatchでTimer_addは”0x07FF”番地にはならず、”0x0026”という番地になってしまっていてポインターになりませんでした。CSSだとC言語のやり方が通用しないようですね。

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

設定値が1つだけだったら、関数とかにするまでもなく、#define による定数定義で十分でしょう。プログラムメモリ領域を使うまでもありません。 以下、テーブル参照など、それなりなデータ量を保持したい場合の話ですが、 普通のPCはノイマンアーキテクチャといって、プログラムもデータも同じメモリ空間に保持されていますが、 http://ja.wikipedia.org/wiki/%E3%83%8E%E3%82%A4%E3%83%9E%E3%83%B3%E5%9E%8B PICはハーバードアーキテクチャといって、 プログラムメモリ空間とデータメモリ空間が役割として完全に分離されており、プログラムメモリ空間をデータアクセスすることはできません。 http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%89%E3%83%BB%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3 そのため、プログラム領域にデータを置くことは基本的にできません。 (ただし、最近のPICは、EEPROMアクセスと同様の手順で、プログラムメモリのアクセスが可能になっているものもあります。) PICでプログラム領域をデータの保持用途として使用する方法ですが、 「必要なデータを返す」ようなサブルーチンをプログラムとして書き込んでおく、という手があります。 Cだったら、そういう「必要なデータを返す関数」を作成しておく形になりますかね。 テーブル参照とかだったら、代わりにswitch-caseで必要な値を返す関数を作る感じで。

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

× get_value = timer_add; ○ get_value = *timer_add;

maeken0012
質問者

お礼

回答ありがとうございます。 CCSのマニュアルを読み直してみたら、確かにプログラム領域にデータを書く方法というのが載っているんですね。そこで下のようなプログラムを書きました。 #ORG 0x07F0, 0x07FC CONST CHAR ID[2]= {0x55,0x66}; このようにしたら、0x07F1,0x07F2番地に0x55,0x66を書いてくれました。シミュレーションでWatchでID[1],ID[2]にはそれぞれに緑の文字で”P”という文字が入っていてアドレスも”7F1”、”7F2”となりました。 最初に私がこれならできるかなと思い、つっこみを入れていただいて修正した unsinged char *timer_add; timer_add = (unsigned char *)0x07FF; get_value = *timer_add; このプログラムだと、WatchでTimer_addは”0x07FF”番地にはならず、”0x0026”という番地になってしまっていてポインターになりませんでした。CSSだとC言語のやり方が通用しないようですね。

関連するQ&A