なんとかなるさね

マイコンをネタにブログを始めてみました


RL78マイコン基板(RL78/G10)|秋月のRL78/G10 10pin DIP基板に自作回路でフラッシュ書き込み (2) 

追記 : 一年半以上経ってからですが、それまでの自作回路をType Aとし、別の自作回路をType Bとして追加
しました。Type AはRenesas Flash Programmerで使用出来ますが、RTS信号を必要としますので、Arduino
用に市販されているRTS信号が出力されていないFT232RL搭載USBシリアル変換モジュールでは使えません。
逆に、それらではDTR信号が出力されていますので、Renesas Flash Programmerで使用することは諦めて、
GitHubで公開さているオープンソースソフトウェアのrl78flash(rl78g10flash)を使用することにしてType Bを
追加しました。また、Type Bでは配線量を減らすことを目的としてダイオード1本と抵抗1本にしてみました。

Type A


すみません。マイコン自体の仕様として外部リセット端子を通常の入出力端子/通常の機能端子として使用する
ように設定することが出来るようになっていますが、そのように設定すると以後この自作回路ではフラッシュ
書き込み(ブランクチェックやチェックサムも)出来なくなります。復旧方法がルネサスのユーザコミュニティ
サイト(Rulz)にあります(http://japan.renesasrulz.com/cafe_rene/f/82/p/3504/17366.aspx#17366)ので、
お使いの開発ツールで設定をされたお心当たりのある方は、お手数ですが、参照して下さるようお願いします。


前のエントリで秋月電子さんで販売されているRL78/G10 10pin DIP基板と自作回路(FT232RLと74HC125と
抵抗2本の簡単なもの)とRenesas Flash Programmer V2.05でブランクチェックが出来ましたので、今度は
書き込んでみました。書き込んだプログラムは、ルネサスの国内向けのユーザコミュニティサイト(Rulz)で
公開されていたRL78/G10のサンプルプログラムを少し削ってLEDを素朴に点滅させる程度にしたものです。
結果は、無事に書き込みも出来ました。ついでに、いつものようにちょっと好奇心から、前のエントリで気に
なったFT232RLのWindowsドライバの設定を変更してみたところ、以下の変化がありました。

(1) ポートの詳細設定の'BMオプション'の待ち時間(msec)の値を小さくすると書き込み時間が短くなる

16msec (既定値)       10秒で書き込み終了
  1msec         3秒で書き込み終了



(2) ポートの詳細設定の'クローズ時のRTS設定'にチェックマークを付けると書き込み終了後プログラムが走る

チェックマークを付けない (既定値)       書き込み終了後にプログラムは走り出さない
チェックマークを付ける       書き込み終了後にプログラムが走り出す



今回、Renesas Flash Programmer V2.05とCS+ for CA,CX V3.00.00を使ったのですが、CS+を立ち上げた
ままにしておいても特に問題なくRenesas Flash Programmerを操作出来ました。



ちなみに、Renesas Flash Programmerを起動した後にCS+でビルドし直した場合の動作は以下の通りでした。
 




なお、Renesas Flash Programmerを起動した後にCS+でビルドしていない場合の動作は以下の通りでした。





なお、もともとのRL78/G10のサンプルプログラムですが、以下のウェブページからダウンロードしました。

Home >> かふぇルネ >> サンプルプログラム等 >> LEDのマトリクス構成での使い方 - Rulz
http://japan.renesasrulz.com/cafe_rene/m/sample_program/218.aspx?loc=JP

Type B


すみません。こちらも外部リセット端子を通常の入出力端子/通常の機能端子として使用するように設定すると、
以後フラッシュ書き込み(ブランクチェックやチェックサムも)出来なくなります。ルネサスのユーザコミュニティ
サイト(Rulz)にある復旧方法(http://japan.renesasrulz.com/cafe_rene/f/82/p/3504/17366.aspx#17366)と
同じ要領で復旧出来ます。異なる点は、DTR信号を使用するのでrl78g10flashの引数の-m 2が不要になることと、
こちらの回路では元々そのDTR信号がRESET端子に直結されていますので回路を繋ぎ換える必要が無いことです。


こちらの回路ではrl78g10flashで書き込んでみました。書き込んだプログラムは、ルネサスの国内向けのユーザ
コミュニティサイト(Rulz)で公開されていたRL78/G10のサンプルプログラムそのまま(ただしsrecファイルを
生成するようにビルドし直したもの)と、この後のエントリで以前に作成してあったTOOL0端子から2Mbaudで
ソフトウェアシリアル出力するコードをそのサンプルプログラムに組み込んでみたものの2つを試してみました。

Home >> かふぇルネ >> サンプルプログラム等 >> メリークリスマスに備えて - Rulz
http://japan.renesasrulz.com/cafe_rene/m/sample_program/220.aspx?loc=JP



サンプルプログラムそのまま
rl78g10flash -arv COM14 "G10_PORT_MTX&PWM3.srec" 2K


TOOL0端子から2Mbaudでソフトウェアシリアル出力するコードをそのサンプルプログラムに組み込んだもの
rl78g10flash -arvt 2000000 COM14 "G10_PORT_MTX&PWM3&PUTS.srec" 2K


なお、サンプルプログラム(CS+ for CA,CX用)に組み込んだ内容は以下の通りです。

追加ファイル: putchar.asm

変更ファイル: cg_src
変更内容(該当部分): 赤字の箇所を追加

/******************************************************************************
Global variables and functions
******************************************************************************/
/* Start user code for global. Do not edit comment generated here */
途中省略
void putchar( unsigned char );
void puts( char *p );
void puts( char *p ) { while (*p) putchar( (unsigned char)*p++); }

void Wait_1sec( void );
void Wait_slow( void );
void LED_set(uint16_t LED_DATA);
void LED_on(uint16_t LED_DATA);
void LED_off(uint16_t LED_DATA);
void Slow_up(uint16_t LED_DATA);
void Slow_down(uint16_t LED_DATA);
/* End user code. Do not edit comment generated here */

void R_MAIN_UserInit(void);
/******************************************************************************
* Function Name: main
* Description : This function implements main function.
* Arguments : None
* Return Value : None
******************************************************************************/
void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    while (1U)
    {
        puts("Merry X'mas! My name is RL78/G10.\r\n");

        for (G_LED_PATTERN = 0x01 ; G_LED_PATTERN < 0x1000 ; )
        {
            
            LED_set(G_LED_PATTERN);
            Wait_1sec();
            G_LED_PATTERN = G_LED_PATTERN << 2;

        }
        途中省略
        for ( w_count2 = g_inittime >> 2 ; w_count2 > 0 ; w_count2-- )
        {
            LED_set(TABLE[w_count2 & 3][0]);
            Wait_1sec();
            LED_on(TABLE[w_count2 & 3][1]);
            Slow_down(TABLE[w_count2 & 3][0]);
            Wait_1sec();
            LED_on(TABLE[w_count2 & 3][2]);
            Slow_down(TABLE[w_count2 & 3][1]);
            Wait_1sec();
            LED_on(0x04);
            Wait_1sec();
            Slow_down(TABLE[w_count2 & 3][2]);
            Wait_1sec();
            LED_on(0x02);
            Wait_1sec();
            Slow_down(0x04);
            Wait_slow();
            Wait_1sec();
            for ( w_count = g_inittime >> 3 ; w_count > 0 ; w_count-- )
            {
                LED_set(0x02);
                Wait_1sec();
                LED_set(0x00);
                Wait_1sec();
            }
        }

        if( direction == 0)
        {
            g_inittime -= 4;
            if( g_inittime < 12 )
            {
                direction =1;
            }
        }
        else
        {
            g_inittime += 4;
            if( g_inittime > 20 )
            {
                direction =0;
            }
        }

    }
    /* End user code. Do not edit comment generated here */
}


関連記事

2015/01/05   blog-entry-544   category: RL78 /* 16bit,8bit CISC */

go page top