RL78 CS+のシュミレート と E1エミュレータ での設定の差

CS+でシュミレータ動作確認とE1エミュレータでデバッグしていますが、RAM変数の動作が違います。

タイマー割り込みと、メインルーチンで簡単なプログラムを確認しています。

タイマー割恋でRAM変数にセットしますが、メインに戻りIOポートをアクセスすすると

RAM変数がクリアーされます。

CS+の設定の問題なのでしょうか。

教えてください。

 

 

以下。テストプログラムです。

 

/***********************************************************************/
/* */
/* FILE :Main.c */
/* DATE : */
/* DESCRIPTION :Main Program */
/* CPU TYPE : */
/* */
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/* */
/***********************************************************************/
#include "iodefine.h"

#define DI __DI
#define EI __EI

#define RXDDT P0_bit.no0
#define LEDBIT P0_bit.no1
#define HARISW P0_bit.no2
#define PWBIT P0_bit.no3
#define BUZZPT P0_bit.no4
#define HIMO_SW P13_bit.no7

int Sycnt1;

 

void mainjob(void);
void R_TAU0_Channel0_Start(void);

 

void timerjob(void)
{
if(Sycnt1-- == 0)
{
Sycnt1 = 1000;

}

}


void mainjob(void)
{
R_TAU0_Channel0_Start();
EI();

for(;;)
{
if(PWBIT == 1) // 電源?
{
if(HARISW == 1) // 貼り付けSW ON?
{
P0_bit.no1 = 1;
}
}
}
}

  • チョコです。
    どのような設定で動作させているのかがわからないと判断はできないですね。
    特に,RAMはどのように初期化されているのかも気になります。
    CS+の標準のスタートアップでは,内蔵周辺初期化や変数の初期化後にはmain関数が起動されるはずなのですが,そこらがどうなっているかが影響している気もします。
  • チョコさん、ご返事ありがとうございます。
    ソースはこの用に記載しています。
    初期化はCS+内で初期化されていますがそのままです、
    環境としては、RL78/G10 CS+ CCLRL E1ミュレータ で行っています。
    RL78シュミレータでは、C言語の通りタイマー割り込みでSycnt変数にセットして
    メインでIOポートアクセスを行っていますが正常にアクセスしています。
    ところが、E1エミュレータにハード基板を接続して動作させると、タイマー割り込みで
    Sycntにセットしても、メインでIOアクセスを行うと、Sycntが0になります。
    プロパティをあちらこちら見ていますが、問題点が見つかりません。

    ご教授ください。
  • チョコです。

    RL78/G10ですか。安全機能が悪さをしているかが気になっていたのですが,G10では無関係ですね。

    シミュレータは,ハードウェアの全てをカバーできている訳ではないので,そこらが影響している可能性はあります。電源電圧が規格を満足していないとかノイズが大きいとかはないでしょうか。

    シミュレータで確認したことはないのですが,ウォッチドッグタイマが悪さをしていないかも気になります。

    また,E1でタイマ割り込みがきちんとかかっているかも確認する必要があります。

     

  • 
    /***********************************************************************/
    /* */
    /* FILE :Main.c */
    /* DATE : */
    /* DESCRIPTION :Main Program */
    /* CPU TYPE : */
    /* */
    /* NOTE:THIS IS A TYPICAL EXAMPLE. */
    /* */
    /***********************************************************************/
    #include "iodefine.h"
    
    #define DI __DI
    #define EI __EI
    
    #define RXDDT P0_bit.no0
    #define LEDBIT P0_bit.no1
    #define HARISW P0_bit.no2
    #define PWBIT P0_bit.no3
    #define BUZZPT P0_bit.no4
    #define HIMO_SW P13_bit.no7
    
    int Sycnt1;
    
    
    
    void mainjob(void);
    void R_TAU0_Channel0_Start(void);
    
    
    
    void timerjob(void)
    {
        if(Sycnt1-- == 0)
        {
            Sycnt1 = 1000;
    
        }
    
    }
    
    
    void mainjob(void)
    {
        R_TAU0_Channel0_Start();
        EI();
    
        for(;;)
        {
            if(PWBIT == 1) // 電源?
            {
                if(HARISW == 1) // 貼り付けSW ON?
                {
                    P0_bit.no1 = 1;
                }
            }
        }
    }
    
    
    関係あるかわかりませんが割り込み処理で値の更新をしてるらしき Sycnt1 の宣言で volatile が付いてないのは気になりますね。
    あと
    R_TAU0_Channel0_Start() の関数プロトタイプ宣言をヘッダの拠らずに自前でやってるところも気になります。
  • きたさん、こんにちは。NoMaYと申します。

    宜しければ、シュミレータでうまく動いた状況が分かるCS+の画面コピーと、E1エミュレータでうまく動かなかった状況が分かるCS+の画面コピーの、2つの(それ以上でも可)の画面コピーを添付して、見せて頂けないでしょうか?(どんな操作をされて確認されたのかというイメージが沸いて来ないですので、、、)

  • チョコさん
    ご返事ありがとうございます。

    volatile を付けてみましたが、やはり上手くいきません。

    timerjobでIOアクセスを毎回行うようにすると
    ここで、Sycnt1が0リセットするようです。
    どうもIOアクセスを行うと、RAM変数がリセットするようです。



    /***********************************************************************/
    /* */
    /* FILE :Main.c */
    /* */
    /***********************************************************************/
    #include "iodefine.h"

    #define DI __DI
    #define EI __EI

    #define HARISW P0_bit.no0
    #define RXDDT P0_bit.no1
    #define LEDBIT P0_bit.no2 // OUT
    #define PWBIT P0_bit.no3 // OUT

    #define BUZZPT P0_bit.no4
    #define HIMO_SW P13_bit.no7

    volatile int Sycnt1;
    volatile char Ledflg;


    void R_TAU0_Channel0_Start(void);



    void timerjob(void)
    {
    if(Sycnt1-- == 0)
    {
    Sycnt1 = 1000; // 100msec

    LEDBIT ^= 1;    // IOアクセス

    if(Ledflg == 1)
    {
    LEDBIT ^= 1;
    }
    }


    }


    void mainjob(void)
    {
    R_TAU0_Channel0_Start();
    EI();
    PWBIT = 1;

    for(;;)
    {
    PWBIT ^= 1;
    // LEDBIT ^= 1;


    /*
    if(PWBIT == 1) // 電源?
    {
    if(HARISW == 0) // 貼り付けSW ON?
    {
    Ledflg = 1;
    }
    else
    {
    Ledflg = 0;
    }
    }
    */
    }
    }
  • NoMaYさん

    画面コーピーを送ります

     

     

    E1画面

     

     

     

    シュミレータ画面

     

     

     

     

  • NoMaYさん
    こんばんは、ご返事ありがとうございます。

    サイトの使い方が分からなくて、あれこれやっていました。
    画像フィル送ったのですが、届きましたでしょうか。

    E1でタイマー処理でブレークしてトレースで送り右側のウォッチで変数表示しています。
    同じように、シュミレータでも行っています


    ご教授ください。
  • > ここで、Sycnt1が0リセットするようです。
    > どうもIOアクセスを行うと、RAM変数がリセットするようです。

    ステップ実行で確認できることと思いますが「~ようです」と推測の表現となっているのはなぜでしょうか?

  • きたさん、こんにちは。NoMaYです。

    画面コピー、どうも有難う御座いました。状況が理解出来ました。奇妙な症状ですね。次は、すみませんが、timerjob()の逆アセンブルウィンドウの画面コピーを見せて頂けませんか?

  • NoMaYさん

    おはようございます。

    timerjob()の逆アセンブルウィンドウの画面コピーを送ります。

     

  • fujitaさん

    ご返事ありがとうございます。
    その様な動作をしている のニュアンスを書いています。
    記載を気を付けます。

    IOをアクセスすると、RAM変数がリセットします。

    HEWで30年H8を使ってきてこんな事はなく、CS+に切り替えた途端起きて戸惑っています。
  • きたさん、おはようござます。NoMaYです。

    逆アセンブルウィンドウの画面コピー、どうも有難う御座いました。命令コード列としては、こういう奇妙な症状と結び付きそうな点は存在しないですね、、、次は、timerjob()の以下の行をステップ実行する時の、ステップ実行前とステップ実行後の、CPUレジスタウィンドウでのレジスタ値表示の画面コピーを見せて頂けないでしょうか?

    LEDBIT ^= 1;

     

  • NoMaYさん

    おはようございます。

    ステップ実行前とステップ実行後の、CPUレジスタウィンドウでのレジスタ値表示の画面コピーを送ります。

    宜しくお願い致します。

     

    実行前

     

    実行後

  • timerjob() のコードが割り込み関数の内容になってませんが、この関数は単体で呼ばれる割り込み処理ではなく正しく書かれた別の割り込み関数から呼ばれるものという認識で合ってますか