• ベストアンサー

【R8C/Tinyマイコン】エラーについて

トランジスタ技術 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; }

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

  • ベストアンサー
  • tadys
  • ベストアンサー率40% (856/2135)
回答No.2

同じ開発環境を持っていないので断定的なことはいえないのですが リンカーでのセクションの指定がまずいのでしょう。

c-beginer
質問者

お礼

御回答ありがとうございます。 おかげさまで動くようになりました。 ご指摘頂いたとおり、リンカが上手くできていなかったようです。 よく見ると、参考書のWorkSpaceと私のとが違っていました。 ちなみに開発環境はHEW4でした。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tanma3
  • ベストアンサー率58% (14/24)
回答No.1

>指定した領域がメモリの範囲外であることは分かるのですが >いつ・どこでアドレスを指定しているのでしょうか? 怪しいのは、"p1_1"とか"p1_2"ではないでしょうか。 コメントを見る限り、LEDの物理アドレスを格納している変数に見えますので、p1_1はポインタ変数ではないですか? であるならば、LED点灯をしたい場合は"*p1_1=1"としなければならないはずです。 >具体的な対処方法、またはエラーの追いかけ方が知りたいです。 >どうかよろしく御願いいたします。 シングルステップまたはブレイクポイントを設定してどのラインでエラーが発生しているか見ればいいのでは?

c-beginer
質問者

お礼

御回答ありがとうございました。 動くようになりました。 ご指摘頂いた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 */

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 3048fマイコンでのA/D変換について

    マイコン初心者ですが今3048fマイコンを使ってA/D変換をしようとしているんですが、うまくいかないので教えて頂きたいです。 プログラムは下の通りです。 #include <3048.h> /* メイン関数 *****************************************/ void main(void){ int ad_data; P1.DDR = 0xff; /*port1出力に設定 表示LED */ P4.DDR = 0x00; /*port4入力に設定 操作用sw1~4 */ P4.PCR.BYTE = 0xff; /*port4プルアップon */ AD.ADCSR.BYTE = 0x33; /* SCAN MODE / CH0~3  */ while(AD.ADCSR.BIT.ADF == 0){} /* 4CH分の変換終了を待つ */ while(1){ if(P4.DR.BIT.B4 == 0){ /* sw1の時 */ ad_data = AD.ADDRA>>8; } else if(P4.DR.BIT.B5 == 0){ /* sw2の時 */ ad_data = AD.ADDRB>>8; } else if(P4.DR.BIT.B6 == 0){ /* sw3の時 */ ad_data = AD.ADDRC>>8; } else if(P4.DR.BIT.B7 == 0){ /* sw4の時 */ ad_data = AD.ADDRD>>8; } P1.DR.BYTE = ad_data & 0xFF; /*上位8bit分だけ表示させる */ } } このように4チャンネル分の0~5vのアナログ信号をスキャンモードでA/D変換し、それぞれ対応したスイッチを押すことによって現在どのくらいの電圧が来ているかLEDに2進数で表示させようとしています。しかしsw1とsw2、sw3とsw4がそれぞれ同じ値を表示しています。例えば、sw1を押したらADDRAの値が表示されますが、sw2を押しても同じADDRAの値が表示されます。またsw3とsw4も同じでどちらを押してもADDRCの値が表示されます。 4チャンネル分を同時にA/D変換することは元々出来ないのでしょうか?いろいろ調べてはいますが理由が分かりせん・・・ADDRA=ADDRB、でADDRC=ADDRDなのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。

  • C言語プログラミングについて…Arduinoを用い

    C言語プログラミングについて…Arduinoを用いて、以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを作りました。次にその使用した「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、いろいろと変えてみたのですが、シリアルモニタを見るとif文を用いた時に「RedSwitch」が押された「回数」ではなく連続的に?押した「秒数」をカウントして困ってます。どうやったら改善できるのでしょうかか?ご教授お願いしたします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void) { digitalWrite(13,LED_ON); delay(500); digitalWrite(13,LED_OFF); delay(500); } void loop() { unsigned char SW_CNT=0,SW_TIME=0,i; while( (SW_TIME<100) || (SW_CNT==0) ) { sw_check(); if ( SW_RedSwitch==2 ) { SW_RedSwitch=0; SW_CNT++; SW_TIME=0; } SW_TIME++; delay(20); } for (i=1 ; i<=SW_CNT ; i++) { blink(); } }

  • H8-3048 LED点灯プログラムについて

    初歩的な質問で申し訳ございません。 H8-3048でスイッチ入力によってLEDを点灯させたいのですが、 スイッチの押されたタイミングによって LEDの点灯状況が変化してしまいます。 何故でしょうか?回路側の問題?ご助言お待ちしています。 参考までに下にLED点灯ソースコードを示します。 #include <3048f.h> #define led P1.DR.BYTE /*P1.DR.BYTEをledに割り当て*/ #define sw1 PA.DR.BIT.B2 #define sw2 PA.DR.BIT.B3 void initport(void) /*入出力端子設定*/ { P1.DDR = 0xff; PA.DDR = 0x00; } int main( void ){ initport(); led = 0x00; /*初期値設定*/ while(1){ if( sw1 == 1 ){ /*sw1が押された時LED点灯*/ led = 0xff;} else if( sw2 == 1 ){ /*sw2が押された時LED消灯*/ led = 0x00;} else{ led;} /*それ以外はLEDの状態保持*/ } }

  • マイコンキットで学ぶ/組み込みシステム入門

    【対象】 日経エレクトロニクス(2007.6.30発行) 16ビット・マイコン搭載ボード付き(組み込み速修キット) エミュレータ一体型 http://techon.nikkeibp.co.jp/embedded/academy/thats1.html http://techon.nikkeibp.co.jp/embedded/academy/guide1.pdf#search='NE... <マイコン> R5F21256SNFP <エミュレータチップ> HD64F2215U(H8Sファミリ/2215グループ) (このマイコンに特殊プログラムをインストールしてエミュレータ機能をもたせているのか?) <パソコンOS> Windows7(32bit版) Sw1(p1_7) Sw2(p1_3) LED1(p2_0) LED2(p2_1) 始めまして。アセンブリの学習を始めた初心者です。 皆さんに質問です。 現在「Sw1を押した時LED1が90%で点灯かつSw2を押した時LED2が80%で点灯する事」を課題として行っています。   私が入力した命令 .INCLUDE sfr_r825.inc .SECTION PROGRAM,CODE .ORG 0009000h Start: MOV.B #01110111b, pd1   p1_7、p1_3を入力ポートに設定 MOV.B #0FFh, pd2     p2_0,p2_1を出力ポートに設定 MOV.B #0FFh, p2      LED1,LED2消灯 Loop: BTST p1_7      Sw1がOnならZフラグに1、OFFなら0 JZ Sw1_On    Zフラグが1ならSw1_Onへ BTST p1_3      Sw2がOnならZフラグに1、OFFなら0 JZ Sw2_On    Zフラグが1ならSw2_Onへ JMP Loop Sw1_On: BCLR p2_0          LED1点灯 JSR Wait_LedOn01     BSET p2_0          LED消灯 JSR Wait_LedOff01 JMP Loop Sw2_On: BCLR p2_1           LED2点灯 JSR Wait_LedOn02 BSET p2_1           LED2消灯 JSR Wait_LedOff02 JMP Loop Wait_LedOn01: MOV.W #198,R0 WaitSub_LedOn01: SBJNZ.W #1,R0,WaitSub_LedOn01 RTS Wait_LedOff01: MOV.W #22,R0 WaitSub_LedOn02: SBJNZ.W #1,R0,WaitSub_LedOn02 RTS Wait_LedOn02: MOV.W #176,R0 WaitSub_LedOn03: SBJNZ.W #1,R0,WaitSub_LedOn03 RTS Wait_LedOff02: MOV.W #44,R0 WaitSub_LedOn04: SBJNZ.W #1,R0,WaitSub_LedOn04 RTS .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END という入力をしました。 しかし、Sw1,Sw2を同時に押した際、LED1のみの点灯となってしまいます。 試行錯誤で今まで行ってきましたが、現在止まってしまっております。 解決策など教えていただければと考えております。 回答の方、宜しくお願いいたします。

  • 【ルネサスのマイコン】E8aからR8C35Aへのコンパイル、書き込み

    初心者です。E8aからR8C35Aへのコンパイル、書き込みができず困っております。 簡単なプログラミングでまずはLEDを点灯させてみたいのですが、HEW4でのコンパイルでエラーが出てしまいます。 sfr_r835a.hをincludeして、かつ、HEW4上のheader fileにも追加しているのに、「P1-1」が使えない理由が分かりません。。。 どなたがご教授頂けませんでしょうか?よろしくお願いいたします。 <エラー内容> [Error(ccom)] unknown variable P1_1 <C source file> #include "sfr_r835a.h" void main(void) { P1_1=0; while(1); } <参考にしたHP> http://goda.blog3.fc2.com/blog-entry-195.html

  • switch文かif文か?

    スイッチ(SW50~SW80)を押したら、それに対応したコマンドを送る。というものを作っています。 スイッチはスライドスイッチなので、 1)ON(0)の間だけコマンドを出して、OFF(1)は止める。 2)ONしている間に別のスイッチが入ったら止める。 という風に組みたいのですが、中々上手くいきません。 8ピンのスライドスイッチなのですが、1~4はIDとして、5~8をコマンドとして使います。 なので、1~4は絶対にONになります。とすると、2)にしたいとき、defaultが使えなくて…if文を入れたらややこしくなりました。 もっと簡潔に、かつ解りやすく書くにはどうしたらいいでしょうか? #define SW1 input(PIN_C0) // ID #define SW2 input(PIN_C1) // ID #define SW3 input(PIN_C2) // ID #define SW4 input(PIN_C3) // ID #define SW50 PIN_C4 #define SW60 PIN_C5 #define SW70 PIN_C6 #define SW80 PIN_C7 uchar LED_ON(void){ uchar DATA; DATA=0x50; DATA+=0x4F; DATA+=0x4E; return(DATA); } uchar LED_OFF(void){ uchar DATA; DATA=0x50; DATA+=0x4F; DATA+=0x46; return(DATA); } void LED(void){ ulong n; uchar DATA; while(1){ WriteFSKbyte(DATA); switch(n){ case SW50:DATA=LED_ON(); if((SW50||SW60||SW80)==0){ DATA=LED_OFF(); } break; case SW60:while(SW60==0){ DATA=LED_ON(); DelayMs(1000); DATA=LED_OFF(); DelayMs(1000); if((SW50||SW70||SW80)==0) break; } break; case SW70:while(SW70==0){ DATA=LED_ON(); DelayMs(500); DATA=LED_OFF(); DelayMs(500); if((SW50||SW60||SW80)==0) break; } break; case SW80:DATA=LED_OFF(); if((SW50||SW60||SW80)==0){ DATA=LED_OFF(); } break; } } }

  • javaに関しての質問です (エラー)

    最近javaの勉強を始めたばかりの者です とある動画をみながら勉強をしていたのですが なぜかエラーが出てしまいます。 エラーの内容は... エラー:この文に制御が移ることはありません     if( c== 13){ エラー:return文が指定されていません この二つです、もし解決方法がわかる方がいましたらぜひ教えてくれるとうれしいです 下がソースコードになります。 public class part01 { static String name = "すけさん"; static int lv = 30; public static void main( String[] args )throws java.io.IOException { putzyosyou(); // 序章を表示 putcommnd(); if(lv<40){ putgameover(); }else{ putgamecrear(); } } public static void putzyosyou() { System.out.println("魔王が世界を滅ぼそうとしている。"); System.out.println(name + "はレベルが" + lv + "のツワモノです"); } public static void putcommnd()throws java.io.IOException { System.out.println("1.魔王を倒しに行く"); System.out.println("2.修行する"); System.out.println("3.だれかに頼る"); System.out.println("4.そんなことよりも寝よう"); int c = inputcommnd(); if( c== '1' ){ System.out.println("魔王が現れた!!"); }else if( c== '2' ){ lv += 2; System.out.println ("レベルが"+ lv + "になった!!"); putcommnd(); } } public static int inputcommnd()throws java.io.IOException { int c = System.in.read(); if( c== 10){ return( inputcommnd() ); if( c== 13){ return( inputcommnd() ); } return( c ); } } public static void putgameover() { System.out.println(name + "は負けました。"); System.out.println("GAME OVER"); } public static void putgamecrear() { String str = name + "は魔王を倒しました。"; put( str ); if(lv>120){ System.out.println("レベル" + lv + "なので魔王ゴミでした"); }else if(lv>80){ System.out.println("レベル" + lv + "なので余裕でした"); }else if(lv>50){ System.out.println("レベル" + lv + "なので倒せました"); }else{ System.out.println("レベル" + lv + "なので苦戦しました"); } System.out.println("GAME CREAR"); } static void put( String str ) { System.out.println( str ); } }

    • ベストアンサー
    • Java
  • 【Win7・64・C#】マイコンUSB通信エラー

    インターフェース2012年6月号付属FM3マイコン基板を使いPCとのUSB通信を試みております。 インターフェース6,7月号との基盤特集ページ(http://www.kumikomi.net/interface/contents/fm3.php)を参考に、マイコンにUSB通信プログラム(仮想シリアルデバイス、PCから送信された文字をエコーバックするプログラム)を書き込み、特集ページの64ビットデバイスドライバをPC(win7、64bit)にインストール、Tera Termで接続しました。ここでTera Termではエラー無く接続でき送信した文字列はエコーバックされて画面上に表示されました。 次にTera TermではなくPC側のプログラムを自作したいと考え、色々なHPを参考に下記の様なコードをVisual C# 2010 Expressで書きました。(また構成マネージャを編集し64ビットに対応(したつもりです)しました) これで実行すると、「システムに接続されたデバイスが機能していません」というエラーが出てしまい、どうにも先に進めなくなってしまいました。 原因をご存知のかたや解決のアイデアのあるかたアドバイスをいただければ幸いです。 どうぞよろしくお願いいたします。 //////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; namespace SerialTest01 { class Program { static SerialPort port = new SerialPort(); static void Main(string[] args) { //if (IntPtr.Size == 4) //{ // Console.WriteLine("32ビット"); //} //else if (IntPtr.Size == 8) //{ // Console.WriteLine("64ビット"); //} SerialInitialization(); Console.ReadLine(); port.Close(); port.Dispose(); } static void SerialInitialization() { try { string[] ports = System.IO.Ports.SerialPort.GetPortNames(); Console.Write(ports[0] + "に接続します。\n\n"); port.PortName = ports[0]; port.BaudRate = 9600; port.DataBits = 8; port.StopBits = StopBits.One; port.Parity = Parity.None; port.Handshake = Handshake.None; port.ReadTimeout = 30000; port.WriteTimeout = 30000; port.DtrEnable = true; port.RtsEnable = true; if (port.IsOpen) Console.Write("ERROR: " + ports[0] + "は既に開いています。"); else port.Open(); } catch (Exception ex) { Console.Write("ERROR:\n" + ex); } } } } ////////////////////////////////////////////////////////////////

  • H8 3664Fのプログラム

    タクトスイッチのチャタリングを回避し、奇数回めのONで LEDの交互点灯を(タイマを使って) やろうとしていますが、なかなかうまくいきません。 入門者でお恥ずかしいですが、下記コードの誤りをご指摘頂けませんでしょうか? 宜しくお願い致します。 以下、コード。 #include <3664.h> //プロトタイプ宣言 void main(void); int SW_Read(void); // 入力SWの状態読み込み 関数 void wait(int); // nミリ秒待つウエイト 関数 void wait1ms(void); // 1ミリ秒待つウエイト 関数 void IOinit(void); // I/O の初期化 関数 void main(void) { if (SW_Read()==1) { IO.PDR8.BIT.B0 = 1; // ポート8のビット0を出力ON IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF DI; // 割り込み禁止 TA.TMA.BYTE = 0x0A; // タイマーA、低速発信・0.25sec設定(タイマーのカウント開始) IRR1.BIT.IRRTA = 0; // タイマーA 検知フラグをゼロクリア IENR1.BIT.IENTA =1; // 割り込み許可 EI; // 割り込み許可 } else { } while(1) { } } /////////////////// I/Oの初期化 void IOinit(void) { IO.PCR8 = 0x03; // ポートコントロールレジスタ: ポート8のビット0・1を出力に設定 // その他のビットは入力に設定 IO.PDR8.BIT.B0 = 0; // ポート8のビット0を出力OFF IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF IO.PCR1 = 0x00; // ポートコントロールレジスタ: ポート1を全ビット0とし、入力に設定 } /////////////////// タイマーA関数 void int_timera (void) // タイマーA関数 { IO.PDR8.BIT.B0 = ~IO.PDR8.BIT.B0; // ポート8のビット0を反転して出力(赤)LED用 IO.PDR8.BIT.B1 = ~IO.PDR8.BIT.B1; // ポート8のビット1を反転して出力(緑)LED用 IRR1.BIT.IRRTA = 0; // タイマーA検知フラグをゼロクリア } /////////////////// スイッチの状態読み込み int SW_Read(void) { int sw1; //スイッチ状態読み込み1回目 int sw2; //スイッチ状態読み込み2回目 int val; //スイッチの状態判定値の入力値 int memval; //入力信号の全回の値 int numcnt; //奇数偶数判定ループ用カウンタ while(1) //モニタリング { sw1 = IO.PDR1.BIT.B7; // スイッチの状態読み込み1回目 wait(10); // 10mS待つ sw2 = IO.PDR1.BIT.B7; // スイッチの状態読み込み2回目 memval=val; //現行のスイッチ状態判定値をメモリに入れ替える if(sw1==1 & sw2==1) // スイッチ読み込み1回目と2回目共にONだったら { //スイッチ状態判定を<押した>と見なして、 val=1; } else { val=0; } if(memval==0 & val==1) //パルスの前後状態を比較し、新規に立ち上がりONであれば、 { numcnt=++numcnt; if(numcnt%2!=0) //ループカウンタが奇数だったら { return(1); // 1を返す } else { } } else { } } } //////////////////// nミリ秒待つウェイト関数 void wait(int time) { int i; // ループカウンタ for(i = 0 ; i < time ; i++) // time回数分ループ wait1ms(); // 1ミリ秒のウェイト関数を呼び出す } //////////////////// 1ミリ秒待つウェイト関数 void wait1ms(void) { int i; // ループカウンタ for(i = 0 ; i < 2662 ; i++); // 1ミリ秒の間ループする } 以上、宜しくお願い申し上げます。

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。