test
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を使用した12bitAD変換のサンプルコードです。AN01端子の電圧を変換します。入力端子により結果の保存されるレジスタが変化するので注意が必要です。
- #include <stdio.h>
- #include <machine.h>
- #include "iodefine.h"
- /*
- * ADコンバータと温度センサーの初期化
- */
- void ad_init(void)
- {
- SYSTEM.PRCR.WORD = 0xA502; /* protect off */
- MSTP(S12AD) = 0; /* ADコンバータ */
- SYSTEM.PRCR.WORD = 0xA500; /* protect on */
- PORT4.PDR.BIT.B1 = 0; /* ポートを入力に */
- MPC.PWPR.BIT.B0WI = 0; /* enable to write PFSWE bit */
- MPC.PWPR.BIT.PFSWE = 1; /* enable to write PFS register */
- //MPC.P40PFS.BIT.ASEL = 1; /* AN000 */
- MPC.P41PFS.BIT.ASEL = 1; /* AN001 */
- MPC.PWPR.BIT.PFSWE = 0; /* disable to write PFS register */
- MPC.PWPR.BIT.B0WI = 1; /* disable to write PFSWE bit */
- S12AD.ADANSA.BIT.ANSA1 = 1; /* A/D チャネル選択レジスタA */
- S12AD.ADCSR.BIT.ADCS = 0; /* シングルスキャンモード */
- //S12AD.ADSSTR1 = 10; /* アナログ入力サンプリング時間 */
- S12AD.ADCSR.BIT.EXTRG = 0;
- }
- /*
- * 電圧の取得
- */
- unsigned int get_ad(void)
- {
- volatile int i;
- unsigned int temp;
- S12AD.ADCSR.BIT.ADST = 1; /* AD変換開始 */
- while(S12AD.ADCSR.BIT.ADST == 1); /* 終了まで待つ */
- temp = S12AD.ADDR1; /* 結果の読み出し */
- /* 変換結果の入るレジスタはピンで決まる ADDR0~ADDR15 */
- return temp;
- }
- int main(void)
- {
- int adv,i;
- ad_init(); //AD変換初期化
- printf("A/D converter test.\n");
- while (1) {
- adv = get_ad();
- printf("AD value %d\n",adv);
- for(i=0;i<50000;i++) nop();
- }
- }
ルネサスエレクトロニクス社のマイコンRX210を使用してPWM波形を出力するサンプルです。MTU3を使用してMTIOC3AとMTIOC3Cから信号を出力します。HighになるタイミングとLowになるタイミングをMTIOC3AではTGRA,TGRBで決め、MTIOC3CはTGRC,TGRDで決めます。このサンプルでは、カウンタのクリアはTGRBで行っています。
- #include "iodefine.h"
- #include <machine.h>
- #define PCLK 125 // 周辺機器のクロック設定 125kHz
- /*
- タイマの設定 MTU3
- */
- void initMTU3pwm(void)
- {
- SYSTEM.PRCR.WORD = 0x0A502;
- MSTP(MTU3) = 0; //MTU3 モジュールスタンバイ解除
- SYSTEM.PRCR.WORD = 0x0A500;
- /* 端子の設定 */
- PORTC.PODR.BIT.B7 = 0; // PC7 MTIOC3A 出力初期値
- PORTC.PDR.BIT.B7 = 1; // PC7 出力設定
- PORTC.PMR.BIT.B7 = 0; // PC7ポートとして使用
- PORTC.PODR.BIT.B6 = 0; // PC6 MTIOC3A 出力初期値
- PORTC.PDR.BIT.B6 = 1; // PC6 出力設定
- PORTC.PMR.BIT.B6 = 0; // PC6ポートとして使用
- MPC.PWPR.BIT.B0WI = 0; // PFSWE書き込み可
- MPC.PWPR.BIT.PFSWE = 1; // PFSレジスタへの書き込み可
- MPC.PC7PFS.BIT.PSEL = 1; // PC7をMTIOC3Aとして使用
- MPC.PC6PFS.BIT.PSEL = 1; // PC6をMTIOC3Cとして使用
- MPC.PWPR.BIT.PFSWE = 0; // PFSレジスタへの書き込み禁止
- PORTC.PMR.BIT.B7 = 1; // PC7周辺機器として使用
- PORTC.PMR.BIT.B6 = 1; // PC6周辺機器として使用
- /* MTUタイマの設定 */
- MTU.TSTR.BIT.CST3 = 0x00; //MTUカウント停止
- MTU3.TCR.BIT.TPSC = 0x00; // CLK PCLK/1 でカウント
- MTU3.TCR.BIT.CCLR = 0x02; //TCNT3はTGRBのコンペアマッチでクリア
- MTU3.TMDR.BIT.MD = 0x02; //タイマーPWMモード1
- // 出力波形の設定
- MTU3.TIORH.BIT.IOA = 0x05; // MTIOC3A 初期出力はHigh出力コンペアマッチでLow出力
- MTU3.TIORH.BIT.IOB = 0x06; // MTIOC3B 初期出力はHigh出力コンペアマッチでHigh出力
- MTU3.TIORL.BIT.IOC = 0x05; // MTIOC3C 初期出力はHigh出力コンペアマッチでLow出力
- MTU3.TIORL.BIT.IOD = 0x06; // MTIOC3D 初期出力はHigh出力コンペアマッチでHigh出力
- MTU3.TGRA = 0; // MTIOC3Aデューティー比
- MTU3.TGRB = 256; // MTU3 周波数
- MTU3.TGRC = 0; // MTIOC3Cデューティー比
- MTU3.TGRD = 256; // MTU3 周波数 MTU3.TGRBと同じ値に
- MTU3.TCNT = 0; //カウンタクリア
- MTU.TSTR.BIT.CST3 = 0x01; //タイマ動作
- }
- void main(void)
- {
- initMTU3pwm();
- MTU3.TGRA = 5; //LED D8の明るさ 0〜255
- MTU3.TGRC = 254; //LED D7の明るさ 0〜255
- while(1) {
- /* ハードウェアで波形出力するのでプログラムでは何もしなくてもよい */
- }
- }
RX210でIRQ割り込みを使用したプログラムの例です。
RX210は割り込み端子にデジタルフィルタがあるのでスイッチを直接接続してもチャタリングに悩まされることがありません。
割り込みプログラムは
RX210は割り込み端子にデジタルフィルタがあるのでスイッチを直接接続してもチャタリングに悩まされることがありません。
- void main(void)
- {
- int i;
- int up4bit,lower4bit;
- unsigned char num = 0;
- PORTA.PDR.BYTE = 0xFF; //ポートAを出力に
- PORTB.PDR.BYTE = 0xFF; //ポートBを出力に
- PORTC.PDR.BYTE = 0xFF; //ポートCを出力に
- PORTC.PODR.BYTE = 0x00; //LEDを消灯
- //MTSP(ICU) = 0;
- IEN(ICU,IRQ0) = 0; //IRQ0禁止
- IPR(ICU,IRQ0) = 0x0F; //割り込み優先順位を最大に設定
- ICU.IRQFLTE0.BIT.FLTEN0 = 0; //デジタルフィルタ禁止
- ICU.IRQFLTC0.BIT.FCLKSEL0 = 3; //デジタルフィルタ PCLK/64
- PORTH.PDR.BIT.B1 = 0; //PH1入力
- MPC.PWPR.BIT.B0WI = 0; // PFSWE書き込み可
- MPC.PWPR.BIT.PFSWE = 1; // PFSレジスタへの書き込み可
- MPC.PH1PFS.BIT.ISEL = 1; //PH1をIRQ0として使用
- MPC.PWPR.BIT.PFSWE = 0; // PFSレジスタへの書き込み禁止
- PORTH.PMR.BIT.B1 = 1; //PH1内蔵機能に使用
- ICU.IRQCR[0].BIT.IRQMD = 1; //立ち下がりエッジ
- IR(ICU,IRQ0) = 0; //フラグを下げる
- ICU.IRQFLTE0.BIT.FLTEN0 = 1; //デジタルフィルタ許可
- IEN(ICU,IRQ0) = 1; //IRQ0許可
- // set_ipl(2);
- setpsw_i(); // 割込み許可 割込み禁止はclrpsw_i()
- while(1) {
- up4bit = num >> 4; //上位4bitの計算
- lower4bit = num & 0x0F; //下位4bitの計算
- PORTB.PODR.BYTE = seg7pat[ up4bit ] | 0x80; // <--上位4bit パターンで数字を表示できるように
- PORTA.PODR.BYTE = seg7pat[ lower4bit ]; // <--下位4bit パターンで数字を表示できるように
- num++; //カウントアップ unsigned char形なので255を過ぎると0に戻る
- //if(num >99) num =0;
- for(i=0;i<50000;i++) { //一定時間待つ
- nop(); //何もしない
- }
- }
- }
割り込みプログラムは
- // ICU IRQ0
- void Excep_ICU_IRQ0(void)
- {
- PORTC.PODR.BYTE = ~ PORTC.PODR.BYTE;
- }