• ベストアンサー

SH2マイコンで

学校の実験でSH2マイコンを使って実験をしたのですが、 プログラムをつくった時に「double」で変数を宣言したら、プログラムがハードでうまく実行できませんでした。(プログラムのエラーはないです。) SH2マイコンでは「double」は使えないのでしょうか? 回答よろしくお願いします。

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

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

「YCSH」はイエローソフト社のホームページによるとdoubleにも対応していると書いてますので、まず大丈夫だと思います。コンパイル時にリンクエラーとか出ていないですよね? たぶんですが、デバッガはイエローソフト社のイエロースコープを使ったと思いますので環境的にも問題ない気がします。 ソースコードは次の点が気になりました。 (1)変数syuの定義が何処にもないけどaの間違いですかね? (2)ソースがfloatですがfloatをdoubleに変えただけですか? (3)scanf("%f",&a);はdoubleの時はscanf("%lf",&a);としていましたか? まぁ、これらの問題を置いておいても「角度」で表示が止まった説明は出来ません。 なので調べて欲しいことがあります。、 1.イエローソフト社のホームページで「YCSH」が最新版であることを確認してください(コンパイラのバグの可能性もあるため)。 http://www.yellowsoft.com/download/qanda_03.html 2.デバッガでステップ実行してみてください。printfで問題が起きたのかscanfで問題が起きたのかはっきりさせる必要があります。

pinochan_1
質問者

お礼

すいません、aの間違いです; (2)はただfloatoをdoubleに変えただけです。 (3)はちゃんとdoubleの時はscanf("%lf",&a);にしていました。 調べてほしいことなんですが、もうこの項目の実験は終わってしまったのでもう調べられないんです。担当の先生に直接聞いています。 みなさん詳しく回答していただきありがとうございました。いろいろと勉強になりました。doubleが使えると分かったので満足です。 回答してくださったことを踏まえて、先生にいろいろと聞いてみたいと思います。

その他の回答 (4)

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

SH7044にはFPU(浮動小数点演算回路)が搭載されいないので固定小数点を使って浮動小数点の演算を行いますので単精度でも重いですが、倍精度だとべらぼうに重いと思います。 それはそれとして、 >main関数にwhile文で無限ループをつくったのですが、「double」だとすぐにループを抜けてしまいました。でも「float」で変数宣言したらちゃんとループを抜けずに実行してくれました。 >実行すると、 >         角度 >と表示されてプログラムが終了してしまいました。(?すら表示されませんでした。) これは無限ループから抜けたんじゃなくて何らかの例外でCPUが停止したんです。ループを抜けるようだと無限ループとは言わない。デバッガで追いかけたらすぐ分る気がするんですけどね。 とりあえず前後も合わせてループの部分を掲載してください。

pinochan_1
質問者

お礼

#include <stdio.h> //SH7044レジスタ #define PEIOR (*((volatile unsigned short *)0xFFFF83B4)) #define PECR1 (*((volatile unsigned short *)0xFFFF83B8)) #define TSTR (*((volatile unsigned char *)0xFFFF8240)) #define TSYR (*((volatile unsigned char *)0xFFFF8241)) #define TOER (*((volatile unsigned char *)0xFFFF820A)) #define TCR3 (*((volatile unsigned char *)0xFFFF8200)) #define TMDR3 (*((volatile unsigned char *)0xFFFF8202)) #define TIOR3H (*((volatile unsigned char *)0xFFFF8204)) #define TIOR3L (*((volatile unsigned char *)0xFFFF8205)) #define TSR3 (*((volatile unsigned char *)0xFFFF822C)) #define TCNT3 (*((volatile unsigned short *)0xFFFF8210)) #define TGR3A (*((volatile unsigned short *)0xFFFF8218)) #define TGR3B (*((volatile unsigned short *)0xFFFF821A)) #define TGR3C (*((volatile unsigned short *)0xFFFF8224)) #define TGR3D (*((volatile unsigned short *)0xFFFF8226)) float a, b; void pwm_init(void) //PWMの初期化 { TMDR3 = 0x02; //PWMモード1 PEIOR |= 0x0F00; //PE8-11:OUT PECR1 |= 0x0055; //PE8-11(TIOC3A-TIOC3D):MTU TSTR &= ~0x40; //カウンタストップ TCNT3 = 0; //カウンタクリア TCR3 |= 0x23; //TGR3A TCNTO CLEAR、CLOCK(24.576MHz)/64 TGR3A = 7680; //周期:(1/24.576MHz)*64*7680=20ms TGR3B = 768; // DUTY:(1/24.576MHz)*64*768=2ms TIOR3H = 0x16; //GRA初期出力1、コンペアマッチで出力1 //GRB初期出力0、コンペアマッチで出力0 TGR3C = 7680; //周期:(1/24.576MHz)*64*7680=20ms TGR3D = 768; // DUTY:(1/24.576MHz)*64*768=2ms TIOR3L = 0x16; //GRC初期出力0、コンペアマッチで出力0 //GRD初期出力1、コンペアマッチで出力1 TSTR |= 0x40; //カウンタ開始 } void main(void) { pwm_init(); while(1){ printf("角度は?\n"); scanf("%f",&a); b=(float)384+(float)syu*(float)384/(float)180; printf("%f\n",b); TGR3B = (unsigned short)b; TGR3D = (unsigned short)b; } } 見にくくてすいません

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

開発環境とコンパイラは? > SH2マイコンでは「double」は使えないのでしょうか? GCCでもルネサスの評価版C/C++コンパイラでも、浮動小数点はサポートされているので動かないわけではないと思います。が、「ふつうの」SH2は浮動小数点演算コプロセッサを持っていないので、doubleの演算をするとすごく重くなります。特に割り算なんかやらせたら目も当てられない・・・。 > プログラムがハードでうまく実行できませんでした。(プログラムのエラーはないです。) そういうときは、 1.何をして、 2.どういう結果になると思ったら 3.どうなったか を書いてください。

pinochan_1
質問者

お礼

開発ソフトウェアは、イエローソフト社製YellowIDEです。 RCサーボモータを指定された角度に制御するプログラムなのですが、プログラムを実行したら、すぐにプログラムが終了してしまいました。 その時の状況は、角度を、          printf("角度は?\n");          scanf("%f",&a);          b=(入力した角度aを変換して、doubleに型キャストした計算式)          TGR3B = (unsigned short)b;          TGR3D = (unsigned short)b; こんな感じでコンピュータから入力して制御するつもりだったのですが、実行すると、          角度 と表示されてプログラムが終了してしまいました。(?すら表示されませんでした。)

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

SH2にはハードに浮動小数点回路搭載の有無やら色々バリエーションがあるはずです。 ラインナップ http://japan.renesas.com/fmwk.jsp?cnt=sh7280_series_landing.jsp&fp=/products/mpumcu/superh_family/sh7280_series/ 使用されたコンパイラの名称(HEWか?)とターゲットとなっているSH2の詳細な名称を書いてください。 たぶん、FPUのないSH2でFPUのあるSH2用のコンパイルオプションを指定してしまったとかと言うオチだとは思います(命令例外にならなかったのかが疑問ですが)。

pinochan_1
質問者

お礼

コンパイラは「SH用Cコンパイラ YCSH」です。 SH2マイコンはSH7044です。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

コンパイラは何を使っていますか? > プログラムがハードでうまく実行できませんでした。 どううまくいかなかったのでしょうか?

pinochan_1
質問者

お礼

コンパイラは「SH用Cコンパイラ YCSH」です。 どううまくいかなかったかというと、 main関数にwhile文で無限ループをつくったのですが、「double」だとすぐにループを抜けてしまいました。でも「float」で変数宣言したらちゃんとループを抜けずに実行してくれました。

関連するQ&A

  • SHマイコンとPICマイコンとAVRマイコン

    SHマイコンとPICマイコンとAVRマイコン、どれがおすすめですか? どれも使い勝手等は同じですか?用途は、小指くらいの小型ロボットを制御することです。ラジコンからの信号を受け取って、信号の大きさに応じてDCモータの速度を制御することです。いま、マイコンボードのArduinoを使っているのですがNanoでも大きすぎるので、マイコンを使って回路を自分で作ろうと考えています。マイコンはH8は使ったことがあります。AVRは、Arduino IDEでArduino言語でしかプログラムしたことありません。 どうかご助言よろしお願いします。

  • H8マイコンのプログラミング

    学校の実験でH8マイコンのプログラミングの実験をやっているのですが、実験内容が自分でオリジナルのプログラムを作成するというものなのですが、何か簡単なプログラムはありますかね?

  • SH-2AマイコンをHEWで動かすことについて

    SH-2AマイコンのLEDを点滅させるプログラムをHEWにて作成しデバッグをするのですが ダウンロードしたサンプルプログラムの場合、LED点滅が実行されプログラムを停止することもできます。 しかし自分で作成したワークスペースでは、デバックするとそこで固まり、LED点滅されずプログラムを停止することも出来ず毎回タスクマネージャーから強制終了しています。プログラムをサンプルプログラムと全く同じものにしても、自分のワークスペースでは固まってしまい困っています。

  • SH2マイコンで、強制割り込みが解除できない

    仕事で、SH7149を使用し、HewのVer4.5を利用してとあるプログラムを組んでいます。 ソフト注入、デバッグはAone社のAHデバッガー、AH7000です。 現象は、とある変数をコメントアウトすると強制割り込みが掛かり、ソフトがそこで止まってしまうというものです。 最初、膨大な量のデータをストックしておく必要があり、グローバル変数に「A[200][10][10]、B[200][10][10]」という変数を宣言しました。 が、グローバル領域に宣言すると容量が足らず、仕方なくMain関数内に一時保管させようという考えで上記変数を宣言し、グローバル宣言した配列は削除しました。 その後、プログラムを作成していく上で、上記配列を使用しなくてもよくなり、コメントアウトしてコンパイルをかけ、コンパイルは成功しました。 その後ソフトを注入し、デバッグをしようと思ったのですが強制割り込みでソフトが全く動かなくなってしまったのです。 試しにコメントアウトを元に戻すと、ソフトはこちらの思ったように動くようになりました。 どなたかこのような現象をご存じではないでしょうか? よろしくお願いします。

  • マイコンSHでSQRT(平方根)が使えません。なぜかしら?

    マイコンSHでSQRT(平方根)が使えません。なぜかしら? 開発環境はルネサスHEWです。 (SuperH RISC engine C/C++ Compiler Package V.9.03 Release 00) プログラムは下記のような簡単なものです。 リンクでエラーになります。 L2310 (E) Undefined external symbol "_sqrt" referenced in "ファイルネーム" 未定義ということのようですが,よくわかりません。 どなたかお助けください。 宜しくお願いします。 ------------- 記 ------------- #include <math.h> { double ret; ret=sqrt(4.0);   ・   ・ }

  • SH7144マイコン→10BitDACへの転送

    趣味の電子工作で、行き詰まってしまいました。 SH7144マイコンを使用しており、そこから外部D/Aコンバータにデジタル信号を送り アナログ電圧の任意波形を生成することを考えています。 D/Aコンバータの扱えるデータ長は10Bit、一度に読み込むデータ長は16Bitです。 入力ピンはシリアル通信用の1ピンです。 ここで、SH7144から16Bitデータをシリアルで送りたいのですが、内臓のSCIでは8Bit長のデータしか扱えないようです。 外部デバイスを使用して8bit+8bit→16bitにして送信する必要があるのか、 マイコン内の機能で実行可能なのか、見当がつかなくなりました。 マイコンに詳しい方、お助けいただけると大変ありがたいです。 パーツは、 DAコンバータ:http://akizukidenshi.com/catalog/g/gI-02794/ マイコン:http://akizukidenshi.com/catalog/g/gK-02507/ です。

  • H8マイコンに関して

    H8マイコンは、1つのプログラムで複数の周辺機器を同時に使うことができますか? 例えば、LCDとSCI(シリアル通信)を同時に動かしたい。または、AD変換とLCD・SCIを同時に走らす。 とかです。 変数の設定次第で、どうにかなると噂で聞きました。(例えば、グローバル変数を設定するとか?) ご回答をお願いします。

  • マイコンからプログラムを読み込むことは出来ますか?

    マイコンからプログラムを読み込むことは出来ますか? フラッシュライタなどでマイコンのROMにプログラムを書き込むことが出来ますが、逆にマイコンからプログラムを読み込むことはできますか? マイコンに転送したプログラムを誤ってパソコン上から消してしまいました。マイコンのROMにそのプログラムが残っているはずなので、マイコンのROMから取り込みたいと思っています。そんなことは可能ですか? ちなみに秋月電子のH8/3048マイコンを使用しております。 マイコンとの通信はRS232Cを使用しています。 パソコンからデータ復元ソフトを使って復元すれば話は早いんですが、学校のパソコンなのでアドミニ権限が無いので復元ソフトを使うことはできないのです・・・

  • マイコンのエミュレータについて

    現在E8エミュレータを使ってマイコン(H8tyni 3687)のデバッグを行おうとしております。 しかしプログラム上にブレークポイントをいくつか置いてデバッグをする際に、1つ目のブレークポイントまでは正常にプログラムが停止するのですが、2つ目のブレークポイントまでプログラムを実行させると、プログラムが停止することなく、固まってしまいます。 1つ目のブレークポイントから2つ目のブレークポイントまでのプログラムで無限ループに入っているのかと思い、1つ目のブレークポイントを削除し、リセットから直接2つ目のブレークポイントまでプログラムを実行させると、正常にプログラムが停止します。しかし次のブレークポイントまで実行させるとまた固まってしまいます。 他の製品にも同じマイコンを使用しているものがあるため、そちらに今回のプログラムをダウンロードしE8エミュレータをつないだところ、特に問題なく1つ目のブレークポイント、2つ目のブレークポイントでプログラムが停止します。 今回問題が発生している基板でエミュレータとマイコン間の波形をオシロで確認したところ、1つ目のブレークポイントから2つ目のブレークポイントまで実行するときに、マイコンのP86(42ピン)が途中まで信号を出力して、突然Lowになってしまいます。(正常なときは信号を出力し終えた後はHighになります。) ちなみにP86(42ピン)はマイコンからエミュレータに対して信号を出力するポートです。 このような現象をご経験された事がある方や、何かお気づきになられた方がいらっしゃいましたら、どのような事でもかまいませんので、ご教授ください。 よろしくお願いいたします。

  • C# 変数の動的な再定義

    こんにちわ  変数の動的な再定義というものが可能かどうかお伺いしたく質問させていただきました。 具体的には宣言時にはpublic int numberと宣言しておいて、プログラムのLoad時に、プログラム内でdouble型で宣言しなおすといった内容です。 ※上記の内容は質問用のサンプルです。ジェネリックを使えばいいとかあると思いますがあくまで可能かどうかの質問です。 やりたいことは、プログラム実行時に型を決めて、コンパイルも通したいという内容です。 dynamicを使用すれば想定通りの動きのものはできましたが、別のやり方も模索しております。 プログラム内でなんとか再定義ができないものかと思ってます。

専門家に質問してみよう