H8,SH,マイコン,ぼやき川柳,ダウンロード

HEWを使用して新規プロジェクトでアプリを作成する方法を後の自分の為にまとめます。この辺は本誌で解説が有っても良いような気がします(私がHEWの使い方を知らないだけで、一般常識なのかな〜〜)。
本来はマニュアルを読むべきなのでしょうが、いい加減なアマチュアなので手っ取り早くWebで調べました。結果、またしてもWhite Cloudsさんのお世話になってしまいました。感謝 m(_ _)m。

演習1「Hello World!」 崩れ

上手くいきませんでした。引き続き調査中です
演習問題の最初は「Hello World!」が相場なのでまずは、挑戦です。LCDに表示出来れば格好良いのですが、そこまでの実力が無いのでSCIF2経由でTera Termに表示させます。ただ、シリアルのRAW/LOWレベルでのIOではアプリぽくないのでprintf()で出力します

背景

Cは読めるのですが、書くのはちょっと・・、"&"、"*"、"構造体"が出てくると何だっけというレベルです。C++に至ってはチンプンカンプンです。printf()の使い方は8月号P52 Appendix1『printf の「超」簡単な実装方法』に載っています。「超」簡単なら私にも出来ると思ったのですが、あに図らんや「超」苦労したので書くことにしました。同じ様な特集が続くので本来書くべき内容が疎かにされ、記事の焼き直しで済ましているのかなーーっと勘ぐってしまいます

プロジェクトの作成

試行しながら載せますので、正確さを欠いているかも知れません。し、これ以外にも色々なやり方があると思います


HEWを立ち上げ、「新規プロジェクトワーク・・」を選択します



プロジェクトタイプ:Applicationを選択してワークスペース名を任意に入力します



CPUシリーズでSH2A-FPU、CPUタイプでSH72620を選択します



特に変更する必要はありませんが、浮動小数点演算モードがMixのままだと、割り込みなどの場合にモード退避・回復が必要になるようなのでDouble決めうちを選びました



I/Oライブラリ使用をチェックしてI/Oストリーム数は3にします



「Hello World!」の表示だけなら変更する必要はありません。必要なライブラリをチェックします



RAM領域の最後のアドレスを指定しました(が、変更しなくても良いようです)



「ベクタテーブル定義」のチェックを入れます



シミュレータは使用しないので変更不要です



「完了」ボタンを押下します



「OK」ボタンを押下します



「ビルド」「SuperH RISC engine・・・」を選択します



「コンパイラ」「アセンブラ」タブは変更不要です(リストの出力制御などはお好みで)
「最適化リンカ」タブでカテゴリで「出力」を選択



出力形式で「バイナリ(ELF/DWARFアブソリュート付き」を選択



カテゴリの「セクション」を選択



Sectionで「DVECTTBL,DINTTBL」をクリックして「変更」ボタン押下、「Modify section」ダイアログでアドレスを変更します。SectionをWクリックしてもダイアログが表示されます
同様にして以下の表の様にアドレスを指定します(あくまでも例ですが、実装メモリの範囲に配置する必要があります)
セクションアドレス内   容  
DVECTTBL,DINTTBL1C000000ベクタテーブル
PResetPRG,PIntPRG1C000500リセット(main()呼出)、割込エントリ
P,C,C$BSEC,C$DSEC,D1C001000プログラム、定数域、変数域
S1C0FFC00スタック域
B,R1C061000グローバル変数域




上表の通り、アドレスを変更すると、このようになります


後で、ビルドして「表示」「マップ」を行うと実際の使用メモリマップが表示されます

上記でプロジェクトの外観が出来ました。本誌では「常識」としてIOストリームの箇所以外に説明がありません



ソースの修正

やっと、やっとソースの修正です


自動生成されたlowレベルIOソースは削除します


おっと、結局このダイアログで削除するようです




/***********************************************************************/
/*                                                                     */
/*  FILE        :Hello.c                                               */
/*  DATE        :Thu, Jul 08, 2010                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :SH72620                                               */
/*                                                                     */
/*  This file is generated by Renesas Project Generator (Ver.4.16).    */
/*                                                                     */
/***********************************************************************/
#include <stdio.h>
#include <math.h>
#include "iodefine.h"
//#include "typedefine.h"
#ifdef __cplusplus
//#include <ios>                        // Remove the comment when you use ios
//_SINT ios_base::Init::init_cnt;       // Remove the comment when you use ios
#endif

void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

void charput(char c)
{

      if( c == '\n' ) {

            while( SCIF2.SCFSR.BIT.TEND == 0 ){ ; }
            SCIF2.SCFTDR.BYTE    = 0x0d;
            SCIF2.SCFSR.BIT.TEND = 0;
            while( SCIF2.SCFSR.BIT.TEND == 0 ){ ; }
            SCIF2.SCFTDR.BYTE    = 0x0a;
            SCIF2.SCFSR.BIT.TEND = 0;
            
      }
      else {
      
            while( SCIF2.SCFSR.BIT.TEND == 0 ){ ; }
            SCIF2.SCFTDR.BYTE    = c;
            SCIF2.SCFSR.BIT.TEND = 0;

      }
}

char charget(void)
{
      return 0;
}

/*---------------------------------------*/
/* Initialize SCIF ch2                   */
/*---------------------------------------*/
scif2_init ()
{
      short sts;
      int        i;

      /* Initialize SCIF2 */
      
      /* Attach SCIF2 unit (TxD2/RxD2) to I/O pad */
      PORT.PFCR0.WORD = (PORT.PFCR0.WORD & 0xF00F) | 0x0440;
      CPG.STBCR4.BIT.MSTP45 = 0;                  /* Enable SCIF2 power                               */
      
      SCIF2.SCSCR.WORD = 0x0000;                  /* Stop SCIF2                                       */
      SCIF2.SCFCR.WORD = 0x0006;                  /* Clear Tx/Rx FIFO                                 */
      sts = SCIF2.SCFSR.WORD;                     /* 受信ステータス空読み                             */
      SCIF2.SCFSR.WORD = 0x0000;                  /* 受信ステータスクリア                             */
      SCIF2.SCSMR.WORD = 0x0000;                  /* Data format (N81)                                */
      SCIF2.SCEMR.WORD = 0x0081;                  /* BGDM=1(倍速モード) ABCS=1(bpsの8倍)              */
      SCIF2.SCBRR.BYTE = 25;                      /* 分周設定                                         */
      SCIF2.SCFCR.WORD = 0x0000;                  /* TREG:8bytes RTRG:1bytes                          */
      SCIF2.SCSCR.WORD = 0x0030;                  /* Start SCIF2 (Set TE,RE)                          */

      for (i=0;i<1000000;i++) ;
}

void main(void)
{
      int i, j;
      double d;
      
      scif2_init();

      printf("HHello World!!\n");
      printf("Welcome to a SH-2a\n");
      printf("\n    n         sin( n )            cos( n )            sqrt( n )\n");            
      
      for (i=0; i<32; i++)
      {
            d = (double)i * 3.14159265358979323846264338327950288 / 180.0;
            printf("%6d %18.14f  %18.14f  %18.14f\n",i, sin( d ), cos( d ), sqrt( (double)i ));
      }

}

本誌を参考にHello.cを作成します。lowlvl.srcの代わりのcharput()とcharget()もHello.cに入れてしまいました




Tiny Dump Monitor
>?

 >RB|RW|RL address ... memory read
 >WB|WW|WL address writedata ... memory write
 >DB|DW|DL address ... memory dump
 >FB|FW|FL address bytes filldata ... memory fill
 >CB|CW|CL address1 address2 bytes ... memory copy
 >UB address ... user program download & go

>
>
>
>ub
Binaryimage download start!
Download address = 1C000000h
Binaryimage download start! ......................................................................................
Download program size : 5574h
Jump address = 1C000500h
Download program start!!

         ;HHello World!!
Welcome to a SH-2a

    n         sin( n )            cos( n )            sqrt( n )
     0   0.00000000000000    1.00000000000000    0.00000000000000
     1   0.01745240643728    0.99984769515639    1.00000000000000
     2   0.03489949670250    0.99939082701910    1.41421356237309
     3   0.05233595624294    0.99862953475457    1.73205080756888
     4   0.06975647374413    0.99756405025982    2.00000000000000
     5   0.08715574274766    0.99619469809175    2.23606797749979
     6   0.10452846326765    0.99452189536827    2.44948974278318
     7   0.12186934340515    0.99254615164132    2.64575131106459
     8   0.13917310096007    0.99026806874157    2.82842712474619
     9   0.15643446504023    0.98768834059514    3.00000000000000
    10   0.17364817766693    0.98480775301221    3.16227766016838
    11   0.19080899537654    0.98162718344766    3.31662479035540
    12   0.20791169081776    0.97814760073381    3.46410161513775
    13   0.22495105434386    0.97437006478524    3.60555127546399
    14   0.24192189559967    0.97029572627600    3.74165738677394
    15   0.25881904510252    0.96592582628907    3.87298334620742
    16   0.27563735581700    0.96126169593832    4.00000000000000
    17   0.29237170472274    0.95630475596304    4.12310562561766
    18   0.30901699437495    0.95105651629515    4.24264068711928
    19   0.32556815445716    0.94551857559932    4.35889894354067
    20   0.34202014332567    0.93969262078591    4.47213595499958
    21   0.35836794954530    0.93358042649720    4.58257569495584
    22   0.37460659341591    0.92718385456679    4.69041575982343
    23   0.39073112848927    0.92050485345244    4.79583152331272
    24   0.40673664307580    0.91354545764260    4.89897948556636
    25   0.42261826174070    0.90630778703665    5.00000000000000
    26   0.43837114678908    0.89879404629917    5.09901951359278
    27   0.45399049973955    0.89100652418837    5.19615242270663
    28   0.46947156278589    0.88294759285893    5.29150262212918
    29   0.48480962024634    0.87461970713940    5.38516480713450
    30   0.50000000000000    0.86602540378444    5.47722557505166
    31   0.51503807491005    0.85716730070211    5.56776436283002
実行結果です。なぜか分からないのですが、最初の文字(空白以外の文字)が化けてしまいます
TinyMonの空送信でHelp表示は我慢ならなかったので修正しました



雑感

文字化けしているので「Hello World! 崩れ」です。

ビルドして驚いたことにバイナリサイズが22KBしかありません。H8+gccでprintf()の様なライブラリを使うと、確か数百KBになったような気がします。最初はリンケージが上手くいってないと勘違いし、パラメタをイジリ回しましたが動かしてみるとすんなり。流石マイコン専用の有償製品だけのことはあります

試しに単精度でもやってみました。結構、誤差が出ます

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます