goo blog サービス終了のお知らせ 

忘備録-備忘録

技術的な備忘録

RX210でインプットキャプチャを使う

2024-12-27 23:35:05 | RX210
RX210のPORTB3を使用してパルスの幅を測定するプログラムです。
 
  1. #include <stdio.h>
  2. #include <machine.h>
  3. #include "iodefine.h"
  4. #include "vect.h"

  5. unsigned short mtu0_ovf_cnt = 0; /* MTU0.TCNT Overflow counter */
  6. volatile unsigned long pulse_cnt = 0; /* Pulse counter */
  7. unsigned char start_flag = 0; /* Measurement start flag */
  8. unsigned char error_flag = 0; /* Error flag */


  9. unsigned int pulseIn(void)
  10. {
  11.     pulse_cnt = 0; // パルス幅リセット
  12.     start_flag = 0; // スタートフラグリセット
  13.     while (pulse_cnt == 0)
  14.         ; //  割り込みが発生するまで待つ
  15.     return pulse_cnt;
  16. }

  17. void MTU0_inputcapture_init(void)
  18. {

  19.     /* ==== MTU module ON ==== */
  20.     SYSTEM.PRCR.WORD = 0x0A502; /* protect off */
  21.     MSTP(MTU) = 0; /* MTU(MTU0 to MTU5) module stop state is canceled */
  22.     SYSTEM.PRCR.WORD = 0x0A500; /* protect on */

  23.     /* ==== Disable Interrupt ==== */
  24.     IEN(MTU0, TGIA0) = 0; /* Disable TGIA0 interrupt */
  25.     IEN(MTU0, TCIV0) = 0; /* Disable TCIV0 interrupt */

  26.     MTU0.TIER.BIT.TGIEA = 0; /* TGIA0 Interrupt Request Disabled */
  27.     MTU0.TIER.BIT.TCIEV = 0; /* TCIV0 Interrupt Request Disabled */

  28.     /* ==== MTU Setting ==== */
  29.     MTU.TSTR.BIT.CST0 = 0; /* MTU0 Count Stop */
  30.     MTU.TSYR.BIT.SYNC0 = 0; /* MTU0 Count Independent */

  31.     MTU0.TCNT = 0x0000; /* Count Clear */
  32.     MTU0.TGRA = 0x0000; /* TGRA Clear */

  33.     /* ---- MPC Setting ---- */
  34.     PORTB.PDR.BIT.B3 = 0; /* PORTB3 is input port */
  35.     PORTB.PMR.BIT.B3 = 0; /* select I/O port */
  36.     MPC.PWPR.BIT.B0WI = 0; /* enable writing PFSWE bit */
  37.     MPC.PWPR.BIT.PFSWE = 1; /* enable writing PFS register */
  38.     MPC.PB3PFS.BYTE = 0x01; /* Select MTIOC0A */
  39.     MPC.PWPR.BIT.PFSWE = 0; /* disable writing PFS register */
  40.     MPC.PWPR.BIT.B0WI = 1; /* disable writing PFSWE bit */
  41.     PORTB.PMR.BIT.B3 = 1; /* select peripheral functions */

  42.     MTU0.TCR.BYTE = 0x21; /* PCLKB/4 */
  43.                           /* Count at rising edge */
  44.                           /* TCNT cleared by TGRA input capture */

  45.     // MTU0.TIORH.BYTE = 0x08; /* MTIOC0A(PORTB3) */
  46.     MTU0.TIORH.BYTE = 0x0A; /* Input capture at rising edge 両エッジでキャプチャ*/

  47.     MTU0.TMDR.BYTE = 0x00; /* Normal mode */

  48.     /* ==== ICU Setting ==== */
  49.     IPR(MTU0, TGIA0) = 3; /* TGIA0 interrupt request level 3 */
  50.     IPR(MTU0, TCIV0) = 4; /* TCIV0 interrupt request level 4 */

  51.     IR(MTU0, TGIA0) = 0; /* Clear TGIA0 interrupt request */
  52.     IR(MTU0, TCIV0) = 0; /* Clear TGIV0 interrupt request */

  53.     /* ==== Enable Interrupt ==== */
  54.     MTU0.TIER.BIT.TGIEA = 1; /* TGIA0 Interrupt Request Enabled */
  55.     MTU0.TIER.BIT.TCIEV = 1; /* TCIV0 Interrupt Request Enabled */

  56.     IEN(MTU0, TGIA0) = 1; /* Enable TGIA0 interrupt */
  57.     IEN(MTU0, TCIV0) = 1; /* Enable TCIV0 interrupt */

  58.     MTU.TSTR.BIT.CST0 = 1; /* ---- MTU0 Start ---- */
  59. }

  60. void error_proc(void)
  61. {
  62.     pulse_cnt = 0xffffffff;
  63. }

  64. void Excep_MTU0_TCIV0(void)
  65. {

  66.     /* ---- During the pulse period measurement ---- */
  67.     if (start_flag == 1)
  68.     {
  69.         if (mtu0_ovf_cnt < 0xFFFF)
  70.         { /* Confirmation of the greater than 65535 times */
  71.             mtu0_ovf_cnt++; /* Increment the overflow counter */
  72.         }
  73.         else
  74.         {
  75.             error_flag = 1; /* Measurement error */
  76.             error_proc();
  77.         }
  78.     }
  79. }

  80. void Excep_MTU0_TGIA0(void)
  81. {

  82.     unsigned short tmp_tgra; /* Temporary variable is MTU0.TGRA */

  83.     tmp_tgra = MTU0.TGRA; /* MTU0.TGRA set */

  84.     if (start_flag == 0)
  85.     {
  86.         start_flag = 1; /* Start pulse period measurement */
  87.     }
  88.     else
  89.     {
  90.         /* Calculation of the pulse period */
  91.         pulse_cnt = ((unsigned long)mtu0_ovf_cnt << 16) + (unsigned long)tmp_tgra;
  92.     }

  93.     mtu0_ovf_cnt = 0; /* Clear the overflow counter */
  94. }

  95. void main(void)
  96. {
  97.     unsigned long pulse;

  98.     clrpsw_i();
  99.     change_oscillation_PLL(); /* クロックを水晶振動子50MHzに変更 */
  100.     MTU0_inputcapture_init();
  101.     setpsw_i();

  102.     PORTB.PDR.BIT.B7 = 1;

  103.     while (1)
  104.     {
  105.         PORTB.PODR.BIT.B7 = 1;
  106.         for (int i = 0; i < 18500; i++)
  107.         {
  108.             nop();
  109.         }
  110.         PORTB.PODR.BIT.B7 = 0;
  111.         pulse = pulseIn();

  112.         printf("%d\n", pulse);

  113.         for (int i = 0; i < 8500000; i++)
  114.         {
  115.             nop();
  116.         }
  117.     }
  118. }


RX210を使用してPWMを7個出力する

2024-12-27 22:28:54 | RX210
RX210のタイマユニットMTU0,MTU1,MTU2を組み合わせて同期したPWMを7つ出力するプログラムです。使用するポートはP15,P32,P33,PE4,PB5,P26,P27です。
リストは設定部部のみです。
 
  1. void initMTUsyncPWM(void)
  2. {
  3.     SYSTEM.PRCR.WORD = 0x0A502;
  4.     MSTP(MTU0) = 0; //MTU0 モジュールスタンバイ解除
  5.     MSTP(MTU1) = 0; //MTU1 モジュールスタンバイ解除
  6.     MSTP(MTU2) = 0; //MTU2 モジュールスタンバイ解除
  7.     SYSTEM.PRCR.WORD = 0x0A500;
  8.     /* MTUタイマの設定 */
  9.     MTU.TSTR.BIT.CST0 = 0x00;    //MTUカウント停止
  10.     MTU.TSTR.BIT.CST1 = 0x00;    //MTUカウント停止
  11.     MTU.TSTR.BIT.CST2 = 0x00;    //MTUカウント停止
  12.     /* 同期動作の設定 */
  13.     MTU.TSYR.BIT.SYNC0 = 0x01;    //MTU0同期動作
  14.     MTU.TSYR.BIT.SYNC1 = 0x01;    //MTU1同期動作
  15.     MTU.TSYR.BIT.SYNC1 = 0x01;    //MTU2同期動作
  16.     /* カウント設定 */
  17.     MTU0.TCR.BIT.TPSC = 0x01;    // CLK PCLK/4 でカウント
  18.     MTU1.TCR.BIT.TPSC = 0x01;    // CLK PCLK/4 でカウント
  19.     MTU2.TCR.BIT.TPSC = 0x01;    // CLK PCLK/4 でカウント
  20.     /* カウンタのクリア要因設定 */
  21.     MTU0.TMDR.BIT.MD = 0x03;    //タイマーPWMモード2
  22.     MTU1.TMDR.BIT.MD = 0x03;    //タイマーPWMモード2
  23.     MTU2.TMDR.BIT.MD = 0x03;    //タイマーPWMモード2
  24.     MTU0.TCR.BIT.CCLR = 0x01;    //TCNT0はTGRAのコンペアマッチでクリア
  25.     MTU1.TCR.BIT.CCLR = 0x03;    //TCNT1は同期クリア/同期動作をしている他のチャネルのカウンタクリアでTCNTをクリア
  26.     MTU2.TCR.BIT.CCLR = 0x03;    //TCNT2は同期クリア/同期動作をしている他のチャネルのカウンタクリアでTCNTをクリア
  27.     /* 波形出力の設定 */
  28.     MTU0.TIORH.BIT.IOB = 0x02;    // MTIOC0B 初期出力はLow出力コンペアマッチでHigh出力
  29.     MTU0.TIORL.BIT.IOC = 0x02;    // MTIOC0C 初期出力はLow出力コンペアマッチでHigh出力
  30.     MTU0.TIORL.BIT.IOD = 0x02;    // MTIOC0D 初期出力はLow出力コンペアマッチでHigh出力
  31.     MTU1.TIOR.BIT.IOA = 0x02;    // MTIOC1A 初期出力はLow出力コンペアマッチでHigh出力
  32.     MTU1.TIOR.BIT.IOB = 0x02;    // MTIOC1B 初期出力はLow出力コンペアマッチでHigh出力
  33.     MTU2.TIOR.BIT.IOA = 0x02;    // MTIOC2A 初期出力はLow出力コンペアマッチでHigh出力
  34.     MTU2.TIOR.BIT.IOB = 0x02;    // MTIOC2B 初期出力はLow出力コンペアマッチでHigh出力
  35.     /* ピンの設定 */
  36.     PORT1.PODR.BIT.B5 = 0;        // P15 MTIOC0B 出力初期値
  37.     PORT1.PDR.BIT.B5 = 1;        // P15 出力設定
  38.     PORT1.PMR.BIT.B5 = 0;        // P15 ポートとして使用
  39.     PORT3.PODR.BIT.B2 = 0;        // P32 MTIOC0C 出力初期値
  40.     PORT3.PDR.BIT.B2 = 1;        // P32 出力設定
  41.     PORT3.PMR.BIT.B2 = 0;        // P32 ポートとして使用
  42.     PORT3.PODR.BIT.B3 = 0;        // P33 MTIOC0D 出力初期値
  43.     PORT3.PDR.BIT.B3 = 1;        // P33 出力設定
  44.     PORT3.PMR.BIT.B3 = 0;        // P33 ポートとして使用
  45.     PORTE.PODR.BIT.B4 = 0;        // PE4 MTIOC1A 出力初期値
  46.     PORTE.PDR.BIT.B4 = 1;        // PE4 出力設定
  47.     PORTE.PMR.BIT.B4 = 0;        // PE4 ポートとして使用
  48.     PORTB.PODR.BIT.B5 = 0;        // PB5 MTIOC1B 出力初期値
  49.     PORTB.PDR.BIT.B5 = 1;        // PB5 出力設定
  50.     PORTB.PMR.BIT.B5 = 0;        // PB5 ポートとして使用
  51.     PORT2.PODR.BIT.B6 = 0;        // P26 MTIOC2A 出力初期値
  52.     PORT2.PDR.BIT.B6 = 1;        // P26 出力設定
  53.     PORT2.PMR.BIT.B6 = 0;        // P26 ポートとして使用
  54.     PORT2.PODR.BIT.B7 = 0;        // P27 MTIOC2B 出力初期値
  55.     PORT2.PDR.BIT.B7 = 1;        // P27 出力設定
  56.     PORT2.PMR.BIT.B7 = 0;        // P27 ポートとして使用
  57.     /* 保護解除 */
  58.     MPC.PWPR.BIT.B0WI = 0;        // PFSWE書き込み可
  59.     MPC.PWPR.BIT.PFSWE = 1;        // PFSレジスタへの書き込み可
  60.     /* ピンの機能設定 */
  61.     MPC.P15PFS.BIT.PSEL = 1;    // P15をMTIOC0Bとして使用
  62.     MPC.P32PFS.BIT.PSEL = 1;    // P32をMTIOC0Cとして使用
  63.     MPC.P33PFS.BIT.PSEL = 1;    // P33をMTIOC0Dとして使用
  64.     MPC.PE4PFS.BIT.PSEL = 2;    // PE4をMTIOC1Aとして使用
  65.     MPC.PB5PFS.BIT.PSEL = 2;    // PB5をMTIOC1Bとして使用
  66.     MPC.P26PFS.BIT.PSEL = 1;    // P26をMTIOC2Aとして使用
  67.     MPC.P27PFS.BIT.PSEL = 1;    // P27をMTIOC2Bとして使用
  68.     /* 保護 */
  69.     MPC.PWPR.BIT.PFSWE = 0;        // PFSレジスタへの書き込み禁止
  70.     /* ピンを周辺機器に設定 */
  71.     PORT1.PMR.BIT.B5 = 1;        // P15周辺機器として使用
  72.     PORT3.PMR.BIT.B2 = 1;        // P32周辺機器として使用
  73.     PORT3.PMR.BIT.B3 = 1;        // P33周辺機器として使用
  74.     PORTE.PMR.BIT.B4 = 1;        // PE4周辺機器として使用
  75.     PORTB.PMR.BIT.B5 = 1;        // PB5周辺機器として使用
  76.     PORT2.PMR.BIT.B6 = 1;        // P26周辺機器として使用
  77.     PORT2.PMR.BIT.B7 = 1;        // P27周辺機器として使用
  78.     /* 初期値設定 */
  79.     MTU0.TGRA = 255;            // 周波数設定
  80.     MTU0.TGRB = 300;            // MTIOC0Bのデューティー比設定 256以上の設定はデューティー比 0
  81.     MTU0.TGRC = 300;            // MTIOC0Cのデューティー比設定
  82.     MTU0.TGRD = 300;            // MTIOC0Dのデューティー比設定
  83.     MTU1.TGRA = 300;            // MTIOC1Aのデューティー比設定
  84.     MTU1.TGRB = 300;            // MTIOC1Bのデューティー比設定
  85.     MTU2.TGRA = 300;            // MTIOC2Aのデューティー比設定
  86.     MTU2.TGRB = 300;            // MTIOC2Bのデューティー比設定
  87.     /* MTUタイマ起動 */
  88.     MTU.TSTR.BIT.CST0 = 0x01;    //MTU0カウント動作
  89.     MTU.TSTR.BIT.CST1 = 0x01;    //MTU1カウント動作
  90.     MTU.TSTR.BIT.CST2 = 0x01;    //MTU2カウント動作
  91. }




RX210のPWMを使い音声再生

2017-04-16 13:49:18 | RX210
RX210のPORT3のBIT4にスピーカを接続しPWMを使用して、音声データを出力するプログラムです。割り込みを使用して1周期ごとにパルスの幅を変更します。

#include "iodefine.h"
#include <machine.h>
#include "voice.h"      //音声データの配列
#include "vect.h"

#define PCLK 25000      // 周辺機器のクロック設定 25MHz

/*
   クロック周波数を50MHzに変更
*/
void change_oscillation_PLL(void)
{
  unsigned int i;

  SYSTEM.PRCR.WORD = 0xA507;
  SYSTEM.VRCR = 0x00;
  SYSTEM.MOFCR.BYTE = (0x30);
  SYSTEM.MOSCWTCR.BYTE = (0x0D);
  SYSTEM.MOSCCR.BYTE = 0x00;
  while (0x00 != SYSTEM.MOSCCR.BYTE);
  for (i = 0; i < 100; i++) nop();
  SYSTEM.PLLCR.WORD = (0x0901);
  SYSTEM.PLLWTCR.BYTE = (0x09);
  SYSTEM.PLLCR2.BYTE = 0x00;
  for (i = 0; i < 100; i++) nop();
  SYSTEM.OPCCR.BYTE = (0x00);
  while (0 != SYSTEM.OPCCR.BIT.OPCMTSF);
  SYSTEM.SCKCR.LONG = 0x21821211;
  while (0x21821211 != SYSTEM.SCKCR.LONG);
  SYSTEM.BCKCR.BYTE = 0x01;
  while (0x01 != SYSTEM.BCKCR.BYTE);
  SYSTEM.SCKCR3.WORD = (0x0400);  /* PLL */
  while ((0x0400) != SYSTEM.SCKCR3.WORD);
  SYSTEM.PRCR.WORD = 0xA500;
}

/*
  タイマの設定 MTU0
*/
void initMTU0pwm(void)
{
  SYSTEM.PRCR.WORD = 0x0A502;
  MSTP(MTU0) = 0;                //MTU0 モジュールスタンバイ解除
  SYSTEM.PRCR.WORD = 0x0A500;
  /* 端子の設定 */
  PORT3.PODR.BIT.B4 = 0;    // P34 MTIOC0A 出力初期値
  PORT3.PDR.BIT.B4 = 1;   // P34 出力設定
  PORT3.PMR.BIT.B4 = 0;   // P34ポートとして使用
  MPC.PWPR.BIT.B0WI = 0;    // PFSWE書き込み可
  MPC.PWPR.BIT.PFSWE = 1;   // PFSレジスタへの書き込み可
  MPC.P34PFS.BIT.PSEL = 1;  // P34をMTIOC0Aとして使用
  MPC.PWPR.BIT.PFSWE = 0;   // PFSレジスタへの書き込み禁止
  PORT3.PMR.BIT.B4 = 1;   // P34周辺機器として使用
  /* MTUタイマの設定 */
  MTU.TSTR.BIT.CST0 = 0x00; //MTUカウント停止
  MTU0.TCR.BIT.TPSC = 0x00; // CLK PCLK/1 でカウント
  MTU0.TCR.BIT.CCLR = 0x02; // TCNT0はTGRBのコンペアマッチでクリア
  MTU0.TMDR.BIT.MD = 0x02;  // タイマーPWMモード1
  // 出力波形の設定
  MTU0.TIORH.BIT.IOA = 0x05;  // MTIOC0A 初期出力はHigh出力コンペアマッチでLow出力
  MTU0.TIORH.BIT.IOB = 0x06;  // MTIOC0B 初期出力はHigh出力コンペアマッチでHigh出力
  MTU0.TIORL.BIT.IOC = 0x05;  // MTIOC0C 初期出力はHigh出力コンペアマッチでLow出力
  MTU0.TIORL.BIT.IOD = 0x06;  // MTIOC0D 初期出力はHigh出力コンペアマッチでHigh出力
  MTU0.TGRA = 0;        // MTIOC0Aデューティー比
  MTU0.TGRB = 1563;     // MTU0 周波数   15994.9Hz サンプリング周波数設定
  //    MTU0.TGRB = 1136;     // MTU0 周波数   22007.0Hz
  MTU0.TGRC = 0;        // MTIOC0Cデューティー比
  MTU0.TGRD = 1563;     // MTU0 周波数 MTU3.TGRBと同じ値に
  //    MTU0.TGRD = 1136;     // MTU0 周波数   22007.0Hz
  MTU0.TCNT = 0;        // カウンタクリア
  IR(MTU0, TGIB0) = 0;    // 割り込みフラグクリア
  IEN(MTU0, TGIB0) = 1;   // Enable TGIB0
  IPR(MTU0, TGIB0) = 8;   // Set interrupt priority level
  MTU0.TIER.BIT.TGIEB = 1;  // TGIEB割り込み許可
  MTU.TSTR.BIT.CST0 = 0x01; // タイマ動作
}

//音声データ内のどの位置まで再生したか
unsigned long pos;

void main(void)
{
  change_oscillation_PLL();
  initMTU0pwm();
  pos = 0;
  setpsw_i();           // 割込み許可   割込み禁止はclrpsw_i()
  while (1) {
    /* ハードウェアで波形出力するのでプログラムでは何もしなくてもよい */
  }
}

// MTU0 TGIB0 割り込みルーチン
#include "iodefine.h"
void Excep_MTU0_TGIB0(void)
{
  MTU0.TGRA = voice[pos] >> 5;
  pos++;
  if (pos > 50570) pos = 0;
}



RX210でAD変換

2017-04-16 10:11:53 | RX210
ルネサスエレクトロニクス社のマイコンRX210を使用した12bitAD変換のサンプルコードです。AN01端子の電圧を変換します。入力端子により結果の保存されるレジスタが変化するので注意が必要です。
  1. #include <stdio.h>
  2. #include <machine.h>
  3. #include "iodefine.h"
  4. /*
  5.  * ADコンバータと温度センサーの初期化
  6.  */
  7. void ad_init(void)
  8. {
  9.     SYSTEM.PRCR.WORD = 0xA502;                    /* protect off */
  10.     MSTP(S12AD) = 0;                            /* ADコンバータ */
  11.     SYSTEM.PRCR.WORD = 0xA500;                    /* protect on */
  12.     PORT4.PDR.BIT.B1 = 0;                        /* ポートを入力に */
  13.     MPC.PWPR.BIT.B0WI = 0;                        /* enable to write PFSWE bit */
  14.     MPC.PWPR.BIT.PFSWE = 1;                        /* enable to write PFS register */
  15.     //MPC.P40PFS.BIT.ASEL = 1;                    /* AN000 */
  16.     MPC.P41PFS.BIT.ASEL = 1;                    /* AN001 */
  17.     MPC.PWPR.BIT.PFSWE = 0;                        /* disable to write PFS register */
  18.     MPC.PWPR.BIT.B0WI = 1;                        /* disable to write PFSWE bit */
  19.     S12AD.ADANSA.BIT.ANSA1 = 1;                 /* A/D チャネル選択レジスタA */
  20.     S12AD.ADCSR.BIT.ADCS = 0;                    /* シングルスキャンモード */
  21.     //S12AD.ADSSTR1 = 10;                        /* アナログ入力サンプリング時間 */
  22.     S12AD.ADCSR.BIT.EXTRG = 0;
  23. }
  24. /*
  25.  * 電圧の取得
  26.  */
  27. unsigned int get_ad(void)
  28. {
  29.     volatile int i;
  30.     unsigned int temp;
  31.     S12AD.ADCSR.BIT.ADST = 1;                /* AD変換開始 */
  32.     while(S12AD.ADCSR.BIT.ADST == 1);        /* 終了まで待つ */
  33.     temp = S12AD.ADDR1;                        /* 結果の読み出し */
  34.     /* 変換結果の入るレジスタはピンで決まる ADDR0~ADDR15 */
  35.     return temp;
  36. }
  37. int main(void)
  38. {
  39.     int adv,i;
  40.     ad_init(); //AD変換初期化
  41.     printf("A/D converter test.\n");
  42.     while (1) {
  43.         adv = get_ad();
  44.         printf("AD value %d\n",adv);
  45.         for(i=0;i<50000;i++) nop();
  46.     }
  47. }