忘備録-備忘録

技術的な備忘録

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. }

RX210でPWM波形を出力する

2016-09-29 17:59:54 | RX210
ルネサスエレクトロニクス社のマイコンRX210を使用してPWM波形を出力するサンプルです。MTU3を使用してMTIOC3AとMTIOC3Cから信号を出力します。HighになるタイミングとLowになるタイミングをMTIOC3AではTGRA,TGRBで決め、MTIOC3CはTGRC,TGRDで決めます。このサンプルでは、カウンタのクリアはTGRBで行っています。

  1. #include "iodefine.h"
  2. #include <machine.h>
  3. #define PCLK 125 // 周辺機器のクロック設定 125kHz
  4. /*
  5. タイマの設定 MTU3
  6. */
  7. void initMTU3pwm(void)
  8. {
  9.     SYSTEM.PRCR.WORD = 0x0A502;
  10.     MSTP(MTU3) = 0; //MTU3 モジュールスタンバイ解除
  11.     SYSTEM.PRCR.WORD = 0x0A500;
  12. /* 端子の設定 */
  13.     PORTC.PODR.BIT.B7 = 0;        // PC7 MTIOC3A 出力初期値
  14.     PORTC.PDR.BIT.B7 = 1;        // PC7 出力設定
  15.     PORTC.PMR.BIT.B7 = 0;        // PC7ポートとして使用
  16.     PORTC.PODR.BIT.B6 = 0;        // PC6 MTIOC3A 出力初期値
  17.     PORTC.PDR.BIT.B6 = 1;        // PC6 出力設定
  18.     PORTC.PMR.BIT.B6 = 0;        // PC6ポートとして使用
  19.     MPC.PWPR.BIT.B0WI = 0;        // PFSWE書き込み可
  20.     MPC.PWPR.BIT.PFSWE = 1;        // PFSレジスタへの書き込み可
  21.     MPC.PC7PFS.BIT.PSEL = 1;    // PC7をMTIOC3Aとして使用
  22.     MPC.PC6PFS.BIT.PSEL = 1;    // PC6をMTIOC3Cとして使用
  23.     MPC.PWPR.BIT.PFSWE = 0;        // PFSレジスタへの書き込み禁止
  24.     PORTC.PMR.BIT.B7 = 1;        // PC7周辺機器として使用
  25.     PORTC.PMR.BIT.B6 = 1;        // PC6周辺機器として使用
  26. /* MTUタイマの設定 */
  27.     MTU.TSTR.BIT.CST3 = 0x00;    //MTUカウント停止
  28.     MTU3.TCR.BIT.TPSC = 0x00;    // CLK PCLK/1 でカウント
  29.     MTU3.TCR.BIT.CCLR = 0x02;    //TCNT3はTGRBのコンペアマッチでクリア
  30.     MTU3.TMDR.BIT.MD = 0x02;    //タイマーPWMモード1
  31.     // 出力波形の設定
  32.     MTU3.TIORH.BIT.IOA = 0x05;    // MTIOC3A 初期出力はHigh出力コンペアマッチでLow出力
  33.     MTU3.TIORH.BIT.IOB = 0x06;    // MTIOC3B 初期出力はHigh出力コンペアマッチでHigh出力
  34.     MTU3.TIORL.BIT.IOC = 0x05;    // MTIOC3C 初期出力はHigh出力コンペアマッチでLow出力
  35.     MTU3.TIORL.BIT.IOD = 0x06;    // MTIOC3D 初期出力はHigh出力コンペアマッチでHigh出力
  36.     MTU3.TGRA = 0;                // MTIOC3Aデューティー比
  37.     MTU3.TGRB = 256;            // MTU3 周波数
  38.     MTU3.TGRC = 0;                // MTIOC3Cデューティー比
  39.     MTU3.TGRD = 256;            // MTU3 周波数 MTU3.TGRBと同じ値に
  40.     MTU3.TCNT = 0;                //カウンタクリア
  41.     MTU.TSTR.BIT.CST3 = 0x01;    //タイマ動作
  42. }
  43. void main(void)
  44. {
  45.     initMTU3pwm();
  46.     MTU3.TGRA = 5;        //LED D8の明るさ 0〜255
  47.     MTU3.TGRC = 254;    //LED D7の明るさ 0〜255
  48.     while(1) {
  49. /* ハードウェアで波形出力するのでプログラムでは何もしなくてもよい */
  50.     }
  51. }

RX210でIRQ割り込みを使う

2016-05-06 18:48:31 | RX210
RX210でIRQ割り込みを使用したプログラムの例です。
RX210は割り込み端子にデジタルフィルタがあるのでスイッチを直接接続してもチャタリングに悩まされることがありません。

  1. void main(void)
  2. {
  3.     int i;
  4.     int up4bit,lower4bit;
  5.     unsigned char num = 0;
  6.     PORTA.PDR.BYTE = 0xFF;    //ポートAを出力に
  7.     PORTB.PDR.BYTE = 0xFF;    //ポートBを出力に
  8.     PORTC.PDR.BYTE = 0xFF;    //ポートCを出力に
  9.     PORTC.PODR.BYTE = 0x00;    //LEDを消灯
  10.     //MTSP(ICU) = 0;
  11.     IEN(ICU,IRQ0) = 0;                //IRQ0禁止
  12.     IPR(ICU,IRQ0) = 0x0F;            //割り込み優先順位を最大に設定
  13.     ICU.IRQFLTE0.BIT.FLTEN0 = 0;    //デジタルフィルタ禁止
  14.     ICU.IRQFLTC0.BIT.FCLKSEL0 = 3;    //デジタルフィルタ PCLK/64
  15.     PORTH.PDR.BIT.B1 = 0;            //PH1入力
  16.     MPC.PWPR.BIT.B0WI = 0;            // PFSWE書き込み可
  17.     MPC.PWPR.BIT.PFSWE = 1;            // PFSレジスタへの書き込み可
  18.     MPC.PH1PFS.BIT.ISEL = 1;        //PH1をIRQ0として使用
  19.     MPC.PWPR.BIT.PFSWE = 0;            // PFSレジスタへの書き込み禁止
  20.     PORTH.PMR.BIT.B1 = 1;            //PH1内蔵機能に使用
  21.     ICU.IRQCR[0].BIT.IRQMD = 1;        //立ち下がりエッジ
  22.     IR(ICU,IRQ0) = 0;                //フラグを下げる
  23.     ICU.IRQFLTE0.BIT.FLTEN0 = 1;    //デジタルフィルタ許可
  24.     IEN(ICU,IRQ0) = 1;                //IRQ0許可
  25. //    set_ipl(2);
  26.     setpsw_i();                            // 割込み許可 割込み禁止はclrpsw_i()
  27.     while(1) {
  28.         up4bit = num >> 4;        //上位4bitの計算
  29.         lower4bit = num & 0x0F;    //下位4bitの計算
  30.         PORTB.PODR.BYTE = seg7pat[ up4bit ] | 0x80; // <--上位4bit パターンで数字を表示できるように
  31.         PORTA.PODR.BYTE = seg7pat[ lower4bit ]; // <--下位4bit パターンで数字を表示できるように
  32.         num++;    //カウントアップ unsigned char形なので255を過ぎると0に戻る
  33.         //if(num >99) num =0;
  34.         for(i=0;i<50000;i++) { //一定時間待つ
  35.             nop(); //何もしない
  36.         }
  37.     }
  38. }

割り込みプログラムは

  1. // ICU IRQ0
  2. void Excep_ICU_IRQ0(void)
  3. {
  4.     PORTC.PODR.BYTE = ~ PORTC.PODR.BYTE;
  5. }