電子書籍の厳選無料作品が豊富!

トランジスタ技術 2005年4月号の付録基板R8C/Tiny[Renesas]
を使ってマイコンのお勉強をしてます。

4月号のアセンブラでのCPU制御はできたのですが
5月号からC言語でソースを書くことになっており
第1章の単にLEDを点灯させるプログラムでエラーが
出てしまい困っております。

コンパイルまではできるのですが、いざ実行しようとすると
M16C R8C FoUSB/UART ウィンドウが出てきて
『指定したアドレス値が範囲外です。(6601)』
と怒られます。

指定した領域がメモリの範囲外であることは分かるのですが
いつ・どこでアドレスを指定しているのでしょうか?
具体的な対処方法、またはエラーの追いかけ方が知りたいです。
どうかよろしく御願いいたします。


//Cソース
#include "sfr_r815.h"


void set_IO(void);

void main (void)
{
set_IO();
while(1) {
if (p1_7 == 0) p1_1 = 0;//SW1がONならLED1点灯
else p1_1 = 1;

if (p1_1 == 0) p1_2 = 0;//SW2がONならLED2点灯
else p1_2 = 1;
}
}

void set_IO()
{
drr1 = 1;
drr2 = 1;
pd1_1 = 1;
pd1_2 = 1;
p1_1 = 1;
p1_2 = 1;
}

A 回答 (2件)

同じ開発環境を持っていないので断定的なことはいえないのですが


リンカーでのセクションの指定がまずいのでしょう。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
おかげさまで動くようになりました。

ご指摘頂いたとおり、リンカが上手くできていなかったようです。
よく見ると、参考書のWorkSpaceと私のとが違っていました。

ちなみに開発環境はHEW4でした。ありがとうございました。

お礼日時:2008/07/27 23:09

>指定した領域がメモリの範囲外であることは分かるのですが


>いつ・どこでアドレスを指定しているのでしょうか?
怪しいのは、"p1_1"とか"p1_2"ではないでしょうか。
コメントを見る限り、LEDの物理アドレスを格納している変数に見えますので、p1_1はポインタ変数ではないですか?
であるならば、LED点灯をしたい場合は"*p1_1=1"としなければならないはずです。

>具体的な対処方法、またはエラーの追いかけ方が知りたいです。
>どうかよろしく御願いいたします。
シングルステップまたはブレイクポイントを設定してどのラインでエラーが発生しているか見ればいいのでは?
    • good
    • 0
この回答へのお礼

御回答ありがとうございました。
動くようになりました。

ご指摘頂いたp1_1変数はヘッダファイル中で以下のように定義されていました。
よく理解できませんでしたが、勉強しなおしてみます。
ありがとうございました。

<<sfr_r815.h>>
#pragma ADDRESS p1_addr 00E1H /* Port P1 register */

union byte_def p1_addr;
#define p1 p1_addr.byte

#define p1_0 p1_addr.bit.b0 /* Port P10 bit */
#define p1_1 p1_addr.bit.b1 /* Port P11 bit */
#define p1_2 p1_addr.bit.b2 /* Port P12 bit */
#define p1_3 p1_addr.bit.b3 /* Port P13 bit */
#define p1_4 p1_addr.bit.b4 /* Port P14 bit */
#define p1_5 p1_addr.bit.b5 /* Port P15 bit */
#define p1_6 p1_addr.bit.b6 /* Port P16 bit */
#define p1_7 p1_addr.bit.b7 /* Port P17 bit */

お礼日時:2008/07/27 23:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!