RL78のサンプルプログラム等を再開します。

チョコです。

一月程度,忙しい日が続いたのも何とか終わったので,RL78のサンプルプログラム等を再開しようと思います。

その第1弾として,ソフトウェアによるI2Cバスのスレーブ機能を考えています。

10pinのRL78/G10にはIICA0が搭載されていないので,I2Cバスのスレーブとして使用できませんでした。

そこで,R5F10Y16(ROM:2KB,RAM:256B)でどこまでできるかにチャレンジしてみることにします。

(R5F10Y17(ROM:4KB,RAM:512B)の方が楽なのですが,入手性の問題から秋月で入手できるR5F10Y16を

ターゲットにしてみました。)

 

さすがに,400kbpsのファースト・モードには対応できないので,100kbpsの標準モードをターゲットにします。

まずは,ターゲット仕様を決めます。

メモリが少ないので,どこまで実現できるか楽しみです。

 

RL78でのソフトウェアによるI2Cバスのスレーブ機能の実現.pdf

Parents
  • チョコです。
    やはり,2kバイト(実際には最初の200バイト程度は使えないので1.8kバイト程度ですが)ではプログラムが入らなくなり,
    ターゲットをR5F10Y17(4kバイト)に変更してプログラミング中です。
    完成したら,どこまでシュリンクできるか検討する方向で進めていきます。
    (I2C以外の機能で頑張り過ぎました。)
  • > 実際には最初の200バイト程度は使えない

    cstart.asm を小変更すると CALLT テーブル領域にスタートアップのコードの大半を収めることができ、使われない領域を減らせます。japan.renesasrulz.com/.../22161 に添付のファイルでそれを行っているので宜しかったら見てみて下さい。

  • チョコです。
    fujitaさん,コメントありがとうございます。そこも使う予定です。本当は,ベクタ領域の未使用分も使おうとしました。CA78K0Rでは使うことができましたが,CC-RLになって使えなくなってしまいました(アセンブラ記述だけなら,ベクタの記述を.DB2にしてしまえば,使えるのですが,C言語部分があるとダメでした)。
  • > 本当は,ベクタ領域の未使用分も使おうとしました。

    『RL78/G10 ユーザーズマニュアル ハードウェア編』によると RL78/G10 のベクタ・テーブル領域は 10ピンの製品は 0001AH~0007DH の 100バイト、16ピンの製品では 0002AH~0007DH の 84バイトの連続した領域が何の用途も割り当てられてないですね。これを使わないのは勿体ない!

  • > アセンブラ記述だけなら,ベクタの記述を.DB2にしてしまえば,使えるのですが,C言語部分があるとダメでした

    一旦 C でコンパイルした機械語を .DB で書けばベクタ・テーブル領域にコードを置くことも不可能ではなさそうですが、そういう無駄な労力をなしに ROM を無駄なく使えると良いですね。
  • チョコです。
    >これを使わないのは勿体ない!
    そうなんですよ。特に1kバイトしかないものもあるので,ここは何とか使いたいところです。
    ここに配置したい部分だけをCA78K0Rでアセンブラで記述して,HEXを作成し,後でエディタでHEXを結合することも考えています。使い勝手が悪くなるのが気になっています。
  • チョコさん、こんにちは。NoMaYです。

    確認したのがCC-RL V1.02なのでV1.04では挙動が異なるかも知れませんが、ソースコード上でベクタを全く生成しないようにした上で、以下のような設定をすれば、一応ベクタ領域にもコードをおくことが出来ました。(マップファイルの抜粋を添付します。) ですので、CA78K0Rを引っ張り出さなくても済むと思います。(なお、ベースにしたプロジェクトは以前のApplilet EZ PLのスレッドに添付したものです。また、CC-RL V1.02で試しているのは当方特有の事情です。すみません。)

    ・cstart.asmで以下の行をコメントアウトする
      _start    .VECTOR    0
      CALL    !!_hdwinit (もしくは藤田さんソースのCALL    !_hdwinit)
      CALL    !_main        ; main();

    ・CS+にて[セクションの開始アドレス]を以下のようにする
      .text/0001A,.textf,.SLIB,.RLIB/000CE

    ・CS+にて[その他の追加オプション]を以下のようにする
      -change_message=warning=2320

    *** Options ***

    -subcommand=DefaultBuild\EZPLforRL78v2andCCRLv102.clnk
    -Input=DefaultBuild\cstart.obj
    -Input=DefaultBuild\opt_byte.obj
    -SECURITY_ID=00000000000000000000
    -DEVICE=E:\tools\micom\Renesas\CS+\CC\Device\RL78\Devicefile\DR5F10Y47.DVF
    -DEBug
    -NOCOmpress
    -OUtput=DefaultBuild\EZPLforRL78v2andCCRLv102.abs
    -LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4s.lib
    -LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4r.lib
    -ENTry=_start
    -LISt=DefaultBuild\EZPLforRL78v2andCCRLv102.map
    -SHow=ALL
    -AUTO_SECTION_LAYOUT
    -STARt=.text/0001A,.textf,.SLIB,.RLIB/000CE
    -FSymbol=.text
    -ROm=.data=.dataR
    -ROm=.sdata=.sdataR
    -NOMessage
    -NOLOgo
    -change_message=warning=2320
    -end

    *** Error information ***

    W0562320:Section address overflowed out of range : ".text"

    *** Mapping List ***

    SECTION                            START      END         SIZE   ALIGN

    .const                            00000002  00000002         0   2
    .constf                           00000002  00000002         0   2
    .data                             00000002  00000002         0   2
    .sdata                            00000002  00000002         0   2
    .text                             0000001a 00000055        3c   1
    .option_byte                      000000c0  000000c3         4   1
    .security_id                      000000c4  000000cd         a   1
    .textf                            000000ce  000000ce         0   1
    .SLIB                             000000ce  000000ce         0   1
    .RLIB                             000000ce  000000ce         0   1
    .bss                              000ffce0  000ffce0         0   2
    .dataR                            000ffce0  000ffce0         0   2
    .sbss                             000ffe20  000ffe20         0   2
    .sdataR                           000ffe20  000ffe20         0   2

    あと、例示するプロジェクトを用意する手間を横着しようとして、こちらのプロジェクト上で設定してしまったのですが、本来の相手側のプロジェクトで以下のように設定すれば、相手側のプロジェクトで例えば以下のような外部シンボル定義ファイル(*.fsy)を生成させることが出来ますので、それをこちら側のプロジェクトに追加すると、プロジェクト間でサブルーチンコールしたりすることが簡単になります。(もし、ご存知でしたら、すみません、、、)

    ・CS+にて[外部定義シンボルをファイル出力するセクション]に以下を追加する
      .text

    ;RENESAS OPTIMIZING LINKER GENERATED FILE 2017.05.28
    ;fsymbol = .text

    ;SECTION NAME = .text
     .public _start
    _start .equ 0x0000001a
     .public _exit
    _exit .equ 0x00000054

     [画面コピー]


    [追記] 2017/05/28 14:42

    そういえば、先日チョコさんはコード生成では初期化関数のみ生成させることを好まれているようなことを仰っていましたので、たとえ幾らかはコード生成を使っていたとしても、たぶん、今回のチョコさんのソース全体に渡ってベクタを生成させないように記述するのは容易な気がします。その上で、そのプロジェクトから外部シンボル定義ファイル(*.fsy)を生成させ、もう1つプロジェクトを用意し、そちらではその外部シンボル定義ファイル(*.fsy)を利用してベクタ部分だけ記述するようにし、それらからの2つのMOTをCS+のPythonスクリプト等を[ビルド後に実行するコマンド]の設定で実行させて結合するというのは、どうでしょうか。(あくまで苦肉の策ですが。)

  • チョコです。
    NoMaYさん,コメントありがとうございます。
    そのつもりで,エディタでVECTをgrepして全て削除したつもりなんですが。ご指摘のところは.CSEG AT 0でセグメントを0にして.DB2 LLOW _startでリセット・ベクタを定義するようにしたのですが,どここばつのところで引っかかったようです。

    cstart.asmではご指摘の箇所のすぐ上のスタック領域の指定が「 .DS 0x200」となっている部分が気に入らない(RL78/G10ではRAMが最大512バイトしかないのになぜ0x200なんて宣言するんだ)と文句を言ったことがありましたね。

    >コード生成では初期化関数のみ生成させることを好まれている
    コード生成で出力されるAPI関数があまり気に入らないので,初期化のみを良く使っています。
    特に通信関係はいつも言っていますが,問題があると感じています(I2C関係で考慮が足らないので,使い物にならないと考えています)。
    そういえば,最近もCSI+DTCをやった時にCSIの割り込み処理APIがデバイスの使い方に全く合っていないと文句を付けましたね。

    ということで,年のせいか,文句ばっかり言っているような気がします。
  • チョコさん、こんにちは。NoMaYです。

    チョコさんがコードシュリンク前のR5F10Y47でのソースを公開された時に、こちらで確認するのが効率が良さそうだと思っていて、その時には試してみるつもりなのですが、でも、ひとまず忘れない為のメモ代わりの投稿、ということにして書いておくことにしました。

    エラー番号としては、以下の2つの番号が考えられます。

    E0562321:Section ".text" overlaps section ".vect"

    E0562320:Section address overflowed out of range : ".text"

    上の1つ目のものであれば、どこか別のところに残っているのだろうと考えられるのですが、2つめのものであれば、チョコさんがイメージしておられるであろう原因/理由とは別ものだと思われます。先程の策でも実は2つ目のものがエラーとして残っていたのです。(原因/理由は腑に落ちませんが。) それをリンクオプションに -change_message=warning=2320 を指定することで強制的にエラーをワーニング扱いに変更させて、何とかABS/MOTの生成に漕ぎ着けたというカラクリなのです。

    なお、エラーの種類によってはABS/MOTの生成に漕ぎ着けられず駄目なこともあるのですが、このエラーに関しては何とかなりました。(ただ、CC-RL V1.04ではV1.02と挙動が異なっているという可能性は有り得ます。)

    駄目だったエラーは、上の1つ目のものでした。一応、-change_message=warning=2321 を指定するとワーニング扱いになって状況は変わるのですが、今度は別のエラーが発生してしまい、それをワーニング扱いにすると更に別のエラー発生するという状況で、それら全てを -change_message=warning=2321,2320,2022 でワーニング化しようとしても、最後のエラーがワーニング化されずに以下のように表示され、ABS/MOTの生成に漕ぎ着けられませんでした。(この最後のエラーに関しても腑に落ちませんが。)

    W0562321:Section ".text" overlaps section ".vect"
    W0562320:Section address overflowed out of range : ".text"
    E0562022:Address ranges overlap in option "output" : "0x1a-0x5d"

  • チョコです。
    エラーは上側のものです。
    まだ,全体が完成しているわけでないのと,R5F10Y16しかないので,仕様をシュリンクする方向になるかと思います。
    (やりたいのはソフトでのI2Cスレーブなので,他の部分を削ることになるかと思います。)
  • チョコさん、藤田さん、こんにちは。NoMaYです。

    修正版の藤田さんcstart.asmでチョコさんの .CSEG AT 0 / .DB2 LLOW _start の書き換えをしていて頭に浮かんだのですが、昨日の -change_message=warning=2320 を指定することでABS/MOTの生成に漕ぎ着けられるならば、割り込み関数についても同様に(チョコさんのやり方を真似て)出来れば、ひとまず第一ステップをクリアしたと言って良さそうな気がしたのです。

    試してみると、以下のマップファイル(0番地はリセットベクタ、0x18番地は_int18hという割り込み関数のベクタ)が示すABS/MOTを生成することが出来ました。 これって第一ステップをクリア出来たということなのではないかという気がするのです。(ただ、当方の事情で、まずはCC-RL V1.02にて、というところではありますが、、、)

    プロジェクトのファイル一式
    CCRLv102andCStartG10Fujita.OK.zip

    *** Options ***

    -subcommand=DefaultBuild\CCRLv102andCStartG10Fujita.clnk
    -Input=DefaultBuild\cstart.obj
    -Input=DefaultBuild\opt_byte.obj
    -Input=DefaultBuild\main.obj
    -SECURITY_ID=00000000000000000000
    -DEVICE=E:\tools\micom\Renesas\CS+\CC\Device\RL78\Devicefile\DR5F10Y47.DVF
    -DEBug
    -NOCOmpress
    -OUtput=DefaultBuild\CCRLv102andCStartG10Fujita.abs
    -LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4s.lib
    -LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4r.lib
    -ENTry=_start
    -LISt=DefaultBuild\CCRLv102andCStartG10Fujita.map
    -SHow=ALL
    -AUTO_SECTION_LAYOUT
    -STARt=.cstart_g10/0001A,.text,.textf,.RLIB,.SLIB,.sdata,.data/000CE,
    .dataR,.bss/FFCE0,.sdataR,.sbss/FFE20
    -ROm=.data=.dataR
    -ROm=.sdata=.sdataR
    -NOMessage
    -NOLOgo
    -change_message=warning=2320
    -end

    *** Error information ***

    W0562320:Section address overflowed out of range : ".cstart_g10"

    *** Mapping List ***

    SECTION                            START      END         SIZE   ALIGN

    .text_AT0                         00000000  00000001         2   1
    .constf                           00000002  00000002         0   2
    .text_AT18                        00000018  00000019         2   1
    .cstart_g10                       0000001a  00000059        40   1
    .const                            0000005a  0000005b         2   2
    .option_byte                      000000c0  000000c3         4   1
    .security_id                      000000c4  000000cd         a   1
    .text                             000000ce  000000ee        21   1
    .textf                            000000ef  000000ef         0   1
    .RLIB                             000000ef  000000ef         0   1
    .SLIB                             000000ef  000000ef         0   1
    .sdata                            000000f0  000000f1         2   2
    .data                             000000f2  000000f3         2   2
    .dataR                            000ffce0  000ffce1         2   2
    .bss                              000ffce2  000ffce5         4   2
    .sdataR                           000ffe20  000ffe21         2   2
    .sbss                             000ffe22  000ffe23         2   2

    画面コピー




Reply
  • チョコさん、藤田さん、こんにちは。NoMaYです。

    修正版の藤田さんcstart.asmでチョコさんの .CSEG AT 0 / .DB2 LLOW _start の書き換えをしていて頭に浮かんだのですが、昨日の -change_message=warning=2320 を指定することでABS/MOTの生成に漕ぎ着けられるならば、割り込み関数についても同様に(チョコさんのやり方を真似て)出来れば、ひとまず第一ステップをクリアしたと言って良さそうな気がしたのです。

    試してみると、以下のマップファイル(0番地はリセットベクタ、0x18番地は_int18hという割り込み関数のベクタ)が示すABS/MOTを生成することが出来ました。 これって第一ステップをクリア出来たということなのではないかという気がするのです。(ただ、当方の事情で、まずはCC-RL V1.02にて、というところではありますが、、、)

    プロジェクトのファイル一式
    CCRLv102andCStartG10Fujita.OK.zip

    *** Options ***

    -subcommand=DefaultBuild\CCRLv102andCStartG10Fujita.clnk
    -Input=DefaultBuild\cstart.obj
    -Input=DefaultBuild\opt_byte.obj
    -Input=DefaultBuild\main.obj
    -SECURITY_ID=00000000000000000000
    -DEVICE=E:\tools\micom\Renesas\CS+\CC\Device\RL78\Devicefile\DR5F10Y47.DVF
    -DEBug
    -NOCOmpress
    -OUtput=DefaultBuild\CCRLv102andCStartG10Fujita.abs
    -LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4s.lib
    -LIBrary=E:\tools\micom\Renesas\CS+\CC\CC-RL\V1.02.00\lib\rl78nm4r.lib
    -ENTry=_start
    -LISt=DefaultBuild\CCRLv102andCStartG10Fujita.map
    -SHow=ALL
    -AUTO_SECTION_LAYOUT
    -STARt=.cstart_g10/0001A,.text,.textf,.RLIB,.SLIB,.sdata,.data/000CE,
    .dataR,.bss/FFCE0,.sdataR,.sbss/FFE20
    -ROm=.data=.dataR
    -ROm=.sdata=.sdataR
    -NOMessage
    -NOLOgo
    -change_message=warning=2320
    -end

    *** Error information ***

    W0562320:Section address overflowed out of range : ".cstart_g10"

    *** Mapping List ***

    SECTION                            START      END         SIZE   ALIGN

    .text_AT0                         00000000  00000001         2   1
    .constf                           00000002  00000002         0   2
    .text_AT18                        00000018  00000019         2   1
    .cstart_g10                       0000001a  00000059        40   1
    .const                            0000005a  0000005b         2   2
    .option_byte                      000000c0  000000c3         4   1
    .security_id                      000000c4  000000cd         a   1
    .text                             000000ce  000000ee        21   1
    .textf                            000000ef  000000ef         0   1
    .RLIB                             000000ef  000000ef         0   1
    .SLIB                             000000ef  000000ef         0   1
    .sdata                            000000f0  000000f1         2   2
    .data                             000000f2  000000f3         2   2
    .dataR                            000ffce0  000ffce1         2   2
    .bss                              000ffce2  000ffce5         4   2
    .sdataR                           000ffe20  000ffe21         2   2
    .sbss                             000ffe22  000ffe23         2   2

    画面コピー




Children
  • チョコです。

    5月末にアナウンスしていた,10ピンのR5F10Y16(2kROM)にソフトウェアでIICバスのスレーブ機能を組み込んだものがやっとできたのでサンプルプログラム等にpostしました。

    最初は単純にプログラミングしていたのですが,2kバイトに収まらず,R5F10Y17(4kROM)を新たに入手してデバッグを開始。ある程度動かしてから,R5F10Y16に組み込むためのシュリンクに挑戦しました。一部仕様を変更したり,ループ制御変数をuint8_tからuint16_tに変更したり,ライブラリの一部をCALLT領域に配置したり,コード生成された初期化部分に手を入れることで完成しました。結果として,コード生成部分に手を加えるのが一番効きました。今回は何とかR5F10Y16に入ったので,ベクタ領域へのプログラムの配置は手を付けませんでした。(これができれば,100バイト程度確保できるのですが。)

    アセンブラ記述のライブラリ本体は約0.5kバイトで,ライブラリで発生されたINTWDTI割り込みを処理し,ライブラリを直接使用する部分(r_intiic.c)が約0.5kバイトで,残りが上位のソフト(main関数,A/D変換,LED点灯処理及びコード生成された初期化部等)が0.7kバイト程度です。

    今回は以下の3つをpostしています。暇のある方は眺めてみてください。アセンブラ記述のライブラリ部のプログラムは細切れになっていて,個々の処理は単純なのですが,全体の流れをつかむのは結構大変かと思います。できるだけ,コメントを充実させたので,コメントを参考に読めば何とかなるかもしれません。そんな時間がない人は,ヘッダ・ファイルのプロトタイプ宣言と,r_intiic.cを参照してもらえれば,使えるかと思います。
    全体としては,多重割り込みを使ったり,ソフトで割り込みをトリガしたりと,結構凝ったやり方をしています。もっとも,一番面倒なのはやはりアセンブラ記述のライブラリ本体ですね。

    何かご意見や,要望があれば,お気軽に投稿してください。
    現在,考えているのは,1つのポートでLEDを2個制御することです。既にハードとしてはLED2個を搭載しているので,後はプログラムで制御するだけです。制御方法としては,LED1を点灯するときにはポートをLowにドライブし,LED2を点灯するときにはポートをHighにドライブします。どちらも点灯しないときにはポート出力を禁止します。ハードの動作は確認済なので,後はプログラミングだけで,この機能を追加してR5F10Y16に組み込むことがターゲットです。

    参考リンク情報

    「ソフトウェアI2Cスレーブプログラム」
    japan.renesasrulz.com/.../380

    「ソフトウェアI2Cスレーブ解説 」
    japan.renesasrulz.com/.../381

    「ソフトウェアI2Cスレーブプログラム (ライブラリ版) 」
    japan.renesasrulz.com/.../382
  • > ループ制御変数をuint8_tからuint16_tに変更したり

    RL78 で uint8_t よか uint16_t の方が小さくなるとかそんなことあるのかなと r_initad.c の R_ADC_Init()

    void R_ADC_Init(void)
    {
    
        uint16_t data_work;
        uint16_t i;
    

    /* 略 */

            for ( i = 0 ; i < SAMPLE ; i++ )
            {
                ad_data[i][ad_ch] = data_work; /* A/Dデータ初期化       */
            }
    

    で使用しているループ変数 i を試しに uint8_t に変更してビルドしてみたところ、最適化レベルが「デバッグ優先(-Onothing)」の条件では

    PROGRAM SECTION: 000006c1 Byte(s)

    PROGRAM SECTION: 000006c4 Byte(s)

    とサイズが増大したものゝ、最適化レベルを「サイズ優先(-Osize)」でビルドした場合では

    PROGRAM SECTION: 00000583 Byte(s)

    PROGRAM SECTION: 00000580 Byte(s)

    とサイズが小さくなりました。この辺りの判断は難しいですね。

  • チョコです。
    ここらは,ルネサスのアプリケーション・ノート「RL78 ファミリ用C コンパイラCC-RLプログラミングテクニック(R01AN3184JJ0100)」の「1.7 型変換」に記載されている内容に基づいたものです。
    何か所かで確認して小さくなったので,後は勢いで書き換えています。
    単純なループ制御に関しては,「RL78ファミリ用CコンパイラCC-RLコーディングテクニック(R20UT3569JJ0100)」の「変数のサイズ」には逆のことが書いてあります(こちらが古い)。
    今回は,終盤でCS+がバージョンアップされるなど,最後までドタバタしてました。
  • チョコです。

    CC-RLがV1.07から未使用のベクタ領域をプログラムで使用できるようになったと,先日やっと気が付きました。

    CS+ RL78コンパイラCC-RL V1.07.00リリースノートの「4.3 ベクタテーブル・セクションをベクタテーブル・アドレス別に生成する機能の追加」には以下の記述がありました。

    「ベクタテーブル・セクションをベクタテーブル・アドレス別に分割して生成する-SPLIT_VECTオプションを追加しました。これにより未使用のベクタテーブル領域を別の用途に活用できるようになりました。

    そこで,前回のプログラムで確認してみることにしました。

    まず,CS+のプロジェクト・ツリーのCC-RLのプロパティを開いて,「リンク・オプション」タグを開いて,「出力コード」の項目を開きます。

    その中で,一番下にある「ベクタ・テーブル・セクションの分割生成」を「はい(-SPLIT_VECT)」に設定します。

    その上で,「共通オプション」タグで,使用するコンパイラのバージョンを最新版にしておきます。

    確認のために,前回作成したr_iicss_lib.asmの最後の部分に以下のように0x0020から配置するように指定してみました。

    ビルドして,シミュレータにダウンロードしてアドレスを確認すると,ちゃんと0x0020から配置されていることが分かります。

    前回,問題となった「未使用ベクタ領域にプログラムを配置することができる」ように修正されていることが確認できました。

    (今回は,機能の確認だけなので,ぎりぎりまで使うような変更はしていません。)