いまPICマイコンのプログラミングをしています。コンパイラはCSSというものを使っています。
設定した値を読み込んでその値でタイマーを動かそうと思っているのですが、12F509というマイコンはEEPROM領域がないので、なんとかしてこれを実現するにはと思い2kワードのプログラミング領域を半分くらいしか使っていないことに気づいたので、その領域の一番後ろの0x07FF番地に何かしらデータを書いてその番地にアクセスしてそこからタイマーの時間を呼び出そうと思ったのですが、このようなことはできるのでしょうか?
C言語だとポインターを使えばよかったと思うのですが、その場合どのように書いたら良いのでしょうか?
ご教授よろしくお願い致します。
たぶん、
unsinged char *timer_add;
timer_add = (unsigned char *)0x07FF;
get_value = timer_add;
これでよかったでしょうか?
No.2ベストアンサー
- 回答日時:
アドレスを直接書いて、アクセスする方法も上記回答のとおり
直せばいけますが、もともと const でデータ定義すれば
済むように思います。
以下 CCSコンパイラの仕様です。
ノート:CCSのconst(定数)修飾子は常にデータがプログラム・メモリーに置かれることを意味し、そのデータは `読取専用`です。これはconst(定数)修飾子が単純に `読取専用`としているANSI定義には従っていません。
回答ありがとうございます。
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言語のやり方が通用しないようですね。
No.3
- 回答日時:
設定値が1つだけだったら、関数とかにするまでもなく、#define による定数定義で十分でしょう。
プログラムメモリ領域を使うまでもありません。以下、テーブル参照など、それなりなデータ量を保持したい場合の話ですが、
普通のPCはノイマンアーキテクチャといって、プログラムもデータも同じメモリ空間に保持されていますが、
http://ja.wikipedia.org/wiki/%E3%83%8E%E3%82%A4% …
PICはハーバードアーキテクチャといって、
プログラムメモリ空間とデータメモリ空間が役割として完全に分離されており、プログラムメモリ空間をデータアクセスすることはできません。
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC% …
そのため、プログラム領域にデータを置くことは基本的にできません。
(ただし、最近のPICは、EEPROMアクセスと同様の手順で、プログラムメモリのアクセスが可能になっているものもあります。)
PICでプログラム領域をデータの保持用途として使用する方法ですが、
「必要なデータを返す」ようなサブルーチンをプログラムとして書き込んでおく、という手があります。
Cだったら、そういう「必要なデータを返す関数」を作成しておく形になりますかね。
テーブル参照とかだったら、代わりにswitch-caseで必要な値を返す関数を作る感じで。
No.1
- 回答日時:
× get_value = timer_add;
○ get_value = *timer_add;
回答ありがとうございます。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 写真のc言語の問題がa以外わかりません。 正直aも自信がなく、解説していただけないでしょうか? 答え 3 2022/04/29 18:21
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- CPU・メモリ・マザーボード デスクトップPCのOS(C:)の空き領域がどんどん減ります。 9 2022/12/12 09:24
- その他(コンピューター・テクノロジー) PIC16F1シリーズマイコンのNCO機能について 1 2023/04/18 08:41
- ドライブ・ストレージ HDDの未割り当て領域が認識されない 7 2022/11/27 18:51
- ノートパソコン パソコンを、アップグレードした後に出来た、Cドライブの後に出来た、このドライブは? 3 2023/04/03 17:10
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- UNIX・Linux Linux(Fedora30)のブートディスクの交換について 2 2023/05/16 13:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SH7144でパルス幅を測定したい。
-
PICマイコンのCLRWDT動作について
-
printfで0x600000番地の次の0x6...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
緯度、経度の 10進法と 60進法...
-
C言語で、メモリを解放しないで...
-
なんかC言語でプログラム書いて...
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
TCP/IP通信時のサーバーからの受信
-
プログラミング ソースコード
-
Excel-VBAのmsgBox()の不思議
-
Webプログラムってネイティブア...
-
【EXCEL】カナ、ひらがなを英字...
-
C# シリアル通信でデータ受信...
-
winsockでソケット通信の開発を...
-
ACCESS側からEXCELの書式を設定...
-
スーパーのレジで並んでいたら...
-
起動中の他のプログラム(orプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PLCとPCの通信
-
レジスタマップって何ですか?
-
SH7144でパルス幅を測定したい。
-
組み込みマイコンでのソフトウ...
-
アセンブラプログラム
-
マイクロ秒で精度が出るタイマー
-
機械語のレジスタペアについて
-
シリアル通信でのデータ取りこぼし
-
H8マイコンのプロテクト方法
-
フラッシュメモリへの書き込み
-
マイコンからSDカード内のテキ...
-
TCNTとTIFRの意味
-
グラフィックLCD SG12...
-
2つのアナログ信号が一致して...
-
古い計量機器からのrs232cを使...
-
USBハブの自作について
-
RTCで取得した値をLCDに表示したい
-
printf文で変数のアドレスを表...
-
arduinoを使って重さ計測
-
マイコンSPI入門
おすすめ情報