GR-SAKURAのプロセッサステータスワード(PSW)にある割り込み許可ビットを1にする方法

GR-SAKURAで一定周期ごとにTPUの位相係数モード1を使ってエンコーダの読み取りをしています。
プログラムは、データシートのp1010の位相係数モード応用を見ながら作りました。
https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/R5F563.pdf#search=%27%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B7%E3%83%BC%E3%83%88+RX63N%27
TPU0.TCNTがTPU0.TGRCと一致したときにコンペアマッチが起きてカウンタクリアしています。
その際に立つフラグのクリアを割り込みを使って処理したいのですが出来ません。

 

割り込みの設定はhttps://www.renesas.com/ja-jp/support/training/seminar/web-quick-learning/rx-short-9.htmlの8:40のところまで出来ていると思います。
動画では、8:40から組み込み関数を使ってプロセッサステータスワード(PSW)にある割り込み許可ビットを1にする時に、
#include<machine.h>とsetpsw_i()で出来るといっているのですが#include<machine.h>をかいてコンパイルした時点で
fatal error: machine.h: No such file or directorycompilation terminated.というエラーが起きます。
#include<machine.h>は既存のヘッダファイルなのでかけば使えると思っていました。
machine.hはどうすれば使用できるでしょうか。
また、別の方法でプロセッサステータスワード(PSW)にある割り込み許可ビットを1に出来るのであれば教えて下さい。

開発環境はIDE_for_GR1.02を使っています。
TPU0.TGRCのTIERフラグ,IRフラグ,IENフラグ,が1になっていることはPCのシリアルモニタで確認済みです。
以下にソースコードを記述します。

 
//位相係数モード応用
//コンペアマッチ等のフラグクリアを割り込みで行う

#include "iodefine.h" //IRに簡単にアクセス可能なマクロを提供してくれる


void setup()
{
//ポートの初期化
SYSTEM.PRCR.WORD = 0xA50B;
MSTP(TPU0) = 0;
MSTP(TPU1) = 0;
SYSTEM.PRCR.WORD = 0xA500;

TPUA.TSTR.BIT.CST0 = 0; //TPU0のカウンタ動作停止
TPUA.TSTR.BIT.CST1 = 0; //TPU1のカウンタ動作停止

PORTA.PMR.BYTE = 0x00; //PORTAを初期化 B0WIを設定するため0
PORTC.PMR.BYTE = 0x0C; //PC2(IO8),PC3(IO9)を周辺機器
TPU1.TMDR.BIT.MD = 4; //位相係数モード1
TPUA.TSYR.BYTE = 0x03; //TPU0とTPU1を同期する
//(TPU0.TCNTとTPU1.TCNTの同期クリアが可能になる)

//機能設定
MPC.PWPR.BYTE = 0x40; //PFSWEビット=1 (PFSレジスタへの書き込み許可
//B0WIビット=0 (PFSWEビット書き込み許可)
MPC.PC2PFS.BYTE = 0x03; //TCLKA機能を使用
MPC.PC3PFS.BYTE = 0x03; //TCLKB機能を使用
MPC.PWPR.BYTE = 0x80; //PFSWEビット=0 (PFSレジスタへの書込み禁止)
//B0WIビット=1 (PFSWEビット書き込み禁止)

//ポート方向
PORTC.PDR.BIT.B2 = 0; //TCLKA入力ポート
PORTC.PDR.BIT.B3 = 0; //TCLKB入力ポート

PORTA.PDR.BIT.B0 = 1;
PORTA.PDR.BIT.B1 = 1;

TPU0.TCNT = 0;
TPU0.TCR.BIT.TPSC = 2; // PCLK/16 = 96MHz/16 = 6MHz
//T=1/f[s] = 1/6MHz = 167[ns]
TPU0.TCR.BIT.CCLR = 5; //TGRCレジスタのコンペアマッチでTPU0.TCNTカウンタクリア
TPU1.TCR.BIT.CCLR = 3; //TPU0.TCNTと同期クリア
TPU0.TIORH.BIT.IOA = 0; //TGRAレジスタはアウトプットコンペアレジスタ
//TIOCA0端子 出力禁止
TPU0.TIORL.BIT.IOC = 0; //TGRCレジスタはアウトプットコンペアレジスタ
//TIOCC0端子 出力禁止

TPU0.TGRA = 29940; //速度制御周期 5ms
TPU0.TGRC = 59880; //位置制御周期 10ms
//バッファ動作設定
TPU0.TIORH.BIT.IOB = 12; //キャプチャ入力元はTPU1のカウントクロック
//TPU0.TIORL.BIT.IOD = 0; //アウトプットコンベア機能オンにするが使わない
TPU0.TMDR.BIT.BFB = 1; //TPU0.TGRBとTPU0.TGRDはバッファ動作

//速度周期キャプチャ(TPU1.TGRA)
TPU1.TIOR.BIT.IOA = 12; //TPU0.TGRAのコンペアマッチの発生 インプットキャプチャ要因
//位置周期キャプチャ(TPU1.TGRB)
TPU1.TIOR.BIT.IOB = 12; //TPU0.TGRCのコンペアマッチの発生 インプットキャプチャ要因

TPU0.TIER.BIT.TGIEA = 1; //IRへのTGRA割り込み要求伝達許可
TPU0.TIER.BIT.TGIEB = 1; //IRへのTGRB割り込み要求伝達許可
TPU0.TIER.BIT.TGIEC = 1; //IRへのTGRC割り込み要求伝達許可
TPU0.TIER.BIT.TGIED = 1; //IRへのTGRD割り込み要求伝達許可
TPU1.TIER.BIT.TGIEA = 1; //IRへのTGRA割り込み要求伝達許可
TPU1.TIER.BIT.TGIEB = 1; //IRへのTGRB割り込み要求伝達許可
TPU1.TIER.BIT.TCIEV = 1; //IRへのオーバフロー割り込み要求伝達許可
TPU1.TIER.BIT.TCIEU = 1; //IRへのアンダフロー割り込み要求伝達許可

IPR(TPU0,TGI0C) = 5; //TPU0のTG0C割り込みをレベル5に設定
IEN(TPU0,TGI0C) = 1; //TPU0のTG0C割り込みを許可

PORTA.PODR.BYTE = 0x03; //LED0,LED1は点灯
TPUA.TSTR.BIT.CST0 = 1; //TPU0のカウンタ動作開始
TPUA.TSTR.BIT.CST1 = 1; //TPU1のカウンタ動作開始
Serial.begin(115200);
}

Parents
  • 割り込み要求先が割り込み要求を受け付けると0になる割り込みステータスフラグ(IR)を、色々試しながらシリアル通信で見てみたら、プロセッサステータスワード(PSW)の割り込み許可ビットをいじらなくても1→0になっていました。これは、割り込みに成功したと捉えていいものなんでしょうか。
  • satoshiさん、こんにちは。NoMaYです。

    実はビデオを見ていないのですが、ひょっとして、ビデオでは割り込み許可ビットを弄らないと割り込みを受け付けるようになりません、と言っていたのに、IDE for GRのArduinoプログラミング環境では割り込み許可ビットを弄らなくても割り込みを受け付けているようなので、困惑しているとかでしょうか?

  • NoMaYさん、こんにちは。satoshiです。
    おっしゃる通りです。困惑しています。
  • satoshiさん、こんにちは。NoMaYです。

    理由は、IDE for GRのArduinoプログラミング環境(ライブラリ)自身が割り込みを使っているのでvoid setup(void){}やvoid loop(void){}に入った時には既にPSWの割り込み許可ビットは1になっている、からです。具体的には、IDE for GR 1.02bのGR-SAKURA用Arduinoライブラリのソースでは、以下で1にしていました。

    ide4gr-1.02b-windows\ide4gr-1.02-windows\hardware\arduino\rx63\cores\rx63n\reset_program.S

    /* setup PSW */
        /**
         * MOD EK 19/08/13 : Added manual write to U bit since we do not switch to
         *                   User mode, which usually handles this.
         * MOD OR 02/09/14 : Removed manual write to I bit. We will keep MCU in
         *                   supervisor mode because sysif wants to lock system.
         */
        ;mvtc   #30000h, psw            /* Set Ubit & Ibit for PSW */
        mvtc    #10000h, psw            /* Set Ubit & Ibit for PSW */

    0523.reset_program.S.txt
    /***********************************************************************/
    /*                                                                     */
    /*      PROJECT NAME :  sketch                                         */
    /*      FILE         :  reset_program.asm                              */
    /*      DESCRIPTION  :  Reset Program                                  */
    /*      CPU SERIES   :  RX600                                          */
    /*      CPU TYPE     :  RX63N                                          */
    /*                                                                     */
    /*      This file is generated by e2studio.                            */
    /*                                                                     */
    /***********************************************************************/
    
    
    
    	/*reset_program.asm*/
    
    	.list
    	.section .text
    	.global _PowerON_Reset    /*global Start routine */
    
    	.extern _HardwareSetup  /*external Sub-routine to initialise Hardware*/
    	.extern __INIT_IOLIB   /*external sub-routine to initialise I/O library */
    	.extern _data
    	.extern _mdata
    	.extern _ebss
    	.extern _bss
    	.extern _edata
    	.extern _main
    	.extern _ustack
    	.extern _istack
    	.extern _rvectors
    	.extern _exit
    
    
    
    _PowerON_Reset :
    /* initialise user stack pointer */
    	mvtc	#_ustack,USP
    
    /* initialise interrupt stack pointer */
    	mvtc	#_istack,ISP
    
    /* setup intb */
    	mvtc	#_rvectors_start, intb	/* INTERRUPT VECTOR ADDRESS  definition	*/
    
    /* setup FPSW */
    	mvtc    #100h, fpsw
    
    /* load data section from ROM to RAM */
    
    	mov     #_mdata,r2      /* src ROM address of data section in R2 */
    	mov     #_data,r1       /* dest start RAM address of data section in R1 */
    	mov     #_edata,r3      /* end RAM address of data section in R3 */
    	sub    r1,r3            /* size of data section in R3 (R3=R3-R1) */
    	smovf                   /* block copy R3 bytes from R2 to R1 */
    
    /* bss initialisation : zero out bss */
    
    	mov	#00h,r2  	/* load R2 reg with zero */
    	mov	#_ebss, r3  /* store the end address of bss in R3 */
    	mov	#_bss, r1 	/* store the start address of bss in R1 */
    	sub   r1,r3	   	/* size of bss section in R3 (R3=R3-R1) */
    	sstr.b
    
        /**
         * MOD LJ 15/03/14 : Added IO library initialisation for USB stack.
         * MOD EK 27/03/14 : Removed. This does not allow any functionality on the
         *                   Sakura, but is not required for USBHost.
         */
        /* I/O library initialized */
        ;bsr.a  __INIT_IOLIB
    
    /* setup PSW */
        /**
         * MOD EK 19/08/13 : Added manual write to U bit since we do not switch to
         *                   User mode, which usually handles this.
         * MOD OR 02/09/14 : Removed manual write to I bit. We will keep MCU in
         *					 supervisor mode because sysif wants to lock system.
         */
        ;mvtc   #30000h, psw            /* Set Ubit & Ibit for PSW */
    	mvtc	#10000h, psw			/* Set Ubit & Ibit for PSW */
    
    /* change PSW PM to user-mode */
        /**
         * MOD EK 19/08/13 : Removed the switch to user-mode so that interrupts can
         *                   be globally enabled by setting the I bit in the PSW
         *                   register.
         * @see interrupts.cpp
         */
    	;MVFC   PSW,R1
    	;OR     #00100000h,R1
    	;PUSH.L R1
    	;MVFC   PC,R1
    	;ADD    #10,R1
    	;PUSH.L R1
    	;RTE
    	;NOP
    	;NOP
    
    /* call the hardware initialiser */ //moved by LJ from after bss intialisation
        bsr.a   _HardwareSetup
        bsr.a   _init
        nop
    
    #ifdef CPPAPP
        bsr.a	__rx_init
    #endif
    /* start user program */
    	bsr.a	_main
    	bsr.a 	_exit
    
    #ifdef CPPAPP
    	.global	_rx_run_preinit_array
    	.type	_rx_run_preinit_array,@function
    _rx_run_preinit_array:
    	mov	#__preinit_array_start,r1
    	mov	#__preinit_array_end,r2
    	bra.a	_rx_run_inilist
    
    	.global	_rx_run_init_array
    	.type	_rx_run_init_array,@function
    _rx_run_init_array:
    	mov	#__init_array_start,r1
    	mov	#__init_array_end,r2
    	mov	#4, r3
    	bra.a	_rx_run_inilist
    
    	.global	_rx_run_fini_array
    	.type	_rx_run_fini_array,@function
    _rx_run_fini_array:
    	mov	#__fini_array_start,r2
    	mov	#__fini_array_end,r1
    	mov	#-4, r3
    	/* fall through */
    
    _rx_run_inilist:
    next_inilist:
    	cmp	r1,r2
    	beq.b	done_inilist
    	mov.l	[r1],r4
    	cmp	#-1, r4
    	beq.b	skip_inilist
    	cmp	#0, r4
    	beq.b	skip_inilist
    	pushm	r1-r3
    	jsr	r4
    	popm	r1-r3
    skip_inilist:
    	add	r3,r1
    	bra.b	next_inilist
    done_inilist:
    	rts
    
    	.section	.init,"ax"
    	.balign 4
    
    	.global __rx_init
    __rx_init:
    
    	.section	.fini,"ax"
    	.balign 4
    
    	.global __rx_fini
    __rx_fini:
    	bsr.a	_rx_run_fini_array
    
            .section .sdata
            .balign 4
            .global __gp
    	.weak   __gp
    __gp:
    
    	.section .data
    	.global ___dso_handle
    	.weak   ___dso_handle
    ___dso_handle:
    	.long	0
    
         .section        .init,"ax"
         bsr.a   _rx_run_preinit_array
         bsr.a   _rx_run_init_array
         rts
    
        .global __rx_init_end
    __rx_init_end:
    
        .section        .fini,"ax"
    
        rts
        .global __rx_fini_end
    __rx_fini_end:
    
    #endif
    
    /* call to exit*/
    _exit:
    	bra  _loop_here
    _loop_here:
        bra _loop_here
    
    	.text
    	.end
    


    ちなみに、私もビデオを見てみました。この際ですので、少し画面コピーを貼り付けてみました。





    [関連リンク]

    ルネサス半導体セミナー
    eラーニング
    製品紹介セミナー
    www.renesas.com/ja-jp/support/training/seminar/web-quick-learning.html


    開発環境の使用方法からプログラムが動作するまで!
    RXショートセミナー
    テキスト
    www.renesas.com/ja-jp/media/support/training/seminar/document_download/s/s024_rx_short.pdf


  • NoMaYさん、こんにちは。satoshiです。
    プログラミング環境についても詳しく知らないといけないですね。ありがとうございます。
Reply Children
No Data