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%27TPU0.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);}
satoshiさん、こんにちは。NoMaYです。実はビデオを見ていないのですが、ひょっとして、ビデオでは割り込み許可ビットを弄らないと割り込みを受け付けるようになりません、と言っていたのに、IDE for GRのArduinoプログラミング環境では割り込み許可ビットを弄らなくても割り込みを受け付けているようなので、困惑しているとかでしょうか?
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 */
/***********************************************************************/ /* */ /* 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