スキップしてメイン コンテンツに移動

sound.c : RX63N

//後でコメントを追加する
#include <stdio.h>
#include <math.h>
#include "iodefine.h"
#include "global.h"
#define SIN_MAX 256
#define RHYZM_MAX 26
void playSound(void);
void stopSound(void);
unsigned char ryzhmCnt = 0;
unsigned char nextRyzhmCntFlag = 0;
unsigned char nextMusicIntervalFlag = 0;
unsigned short sinNow  = 0;
unsigned char volume = 0x01;
unsigned short musicFreq;
unsigned short musicSpeed = 10;
/* 256 c */
unsigned char sounds[] = {
 127,130,133,136,139,142,145,148,
 151,154,157,161,164,166,169,172,
 175,178,181,184,187,189,192,195,
 197,200,202,205,207,210,212,214,
 217,219,221,223,225,227,229,231,
 232,234,236,237,239,240,242,243,
 244,245,246,247,248,249,250,251,
 251,252,252,253,253,253,253,253,
 253,253,253,253,253,252,252,251,
 251,250,249,249,248,247,246,245,
 243,242,241,239,238,236,235,233,
 231,230,228,226,224,222,220,218,
 215,213,211,209,206,204,201,199,
 196,193,191,188,185,182,180,177,
 174,171,168,165,162,159,156,153,
 150,147,144,141,137,134,131,128,
 126,123,120,117,113,110,107,104,
 101,98,95,92,89,86,83,80,
 77,74,72,69,66,63,61,58,
 55,53,50,48,45,43,41,39,
 36,34,32,30,28,26,24,23,
 21,19,18,16,15,13,12,11,
 9,8,7,6,5,5,4,3,
 3,2,2,1,1,1,1,1,
 1,1,1,1,1,2,2,3,
 3,4,5,6,7,8,9,10,
 11,12,14,15,17,18,20,22,
 23,25,27,29,31,33,35,37,
 40,42,44,47,49,52,54,57,
 59,62,65,67,70,73,76,79,
 82,85,88,90,93,97,100,103,
 106,109,112,115,118,121,124,127
};
unsigned char soundInterval[] = {
 191,//シ
 180,//ド
 159,//レ
 142,//ミ
 134,//ファ
 120,//ソ
 89,//ラ
 95,//シ
 90//ド
};
unsigned char musicMap[] = {
 180, 159, 142, 134, 142, 159, 180, 142, 134, 120, 89, 120, 134, 142, 180, 180, 180, 180, 180,
 180, 159, 159, 142, 142, 134, 134, 142, 159, 180
};
unsigned char songs[MUSICNUMBERMAX][100] =  {
 "ドレミファミレドミファソラソファミドドドドドドレレミミファファミレド",
 "ドドレミミソミミレレドミミファソドラドソドドシラソララララソドドレミミソミミレレド",
 "ララファレレミファレソラソファミレドララファレレミファレソラソミファ",
 "ドミファソドミファソドミファソミドモレミミレドドミソソファミファソミドレド",
 "ソファミレミファレドミファソミレミファレミファソミレミファレソファミレミファレド",
 "ミソラソミソドドララソミドレミミソラソミソドドララソミレミドレミレソララソラドドシラソソミミソラソミソドドララソミレミド",
 "ドレミドミドミミレレミファファミレファミファソミソミソファソララソファラソドレミファソララレミファソラシシミファソラシドドシラファシソドドシラソファミレ"
};
unsigned char rhyzm[RHYZM_MAX] = {
 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1, 0
};
/* playSoundState = 1 */
void playSound(void){
 //int b = (int)(ceil(1.0f * sinNow /SIN_MAX));
 //int a = rhyzm[(int)(5.0 * sinNow /SIN_MAX * RHYZM_MAX)];
 //a = rhyzm[a];
 DA.DADR0 = sounds[sinNow] * (volume / 4 + volume % 4) * rhyzm[(int)(1.0f * sinNow / SIN_MAX * RHYZM_MAX)];
 //displayFlag = 1;
}
/* playSoundState = 0 */
void stopSound(void){
 ryzhmCnt = 0;
 nextRyzhmCntFlag = 0;
 DA.DADR0 = 1023;
 CMT.CMSTR0.BIT.STR1 = 0;
 CMT1.CMCNT = 0;
 sinNow = 0;
}
unsigned char myDiv(unsigned char a, unsigned char b){
 unsigned char count=0;
 while(count);
}
//Use CMT3・・・・・・
void playMusic(void){
 //ドレミファミレドミファソラソファミドドドドドドレレミミファファミレド
 static unsigned char ch = 0;
 if(getCmt3Count() > musicSpeed){
  if(ch < 28) ch++;
  else ch = 0;
  setCmt3Count(0);
 }
 CMT1.CMCOR = musicMap[ch] / 2; // / MUSIC_COST;
 musicFreq = musicMap[ch];// 仮
 playSound();
}
void playMusicX(unsigned char musicNumber){
 const unsigned char chf = (unsigned char)strlen(songs[musicNumber]);
 static unsigned char ch = 0;
 if(getCmt3Count() > musicSpeed){
  switch(songs[musicNumber][ch]){
   case 'ト':
   CMT1.CMCOR = 180 / MUSIC_COST;
   musicFreq = 261;
   ch++;
   break;
   case 'レ':
   CMT1.CMCOR = 159 / MUSIC_COST;
   musicFreq = 294;
   break;
   case 'ミ':
   CMT1.CMCOR = 142 / MUSIC_COST;
   musicFreq = 330;
   break;
   case 'フ':
   CMT1.CMCOR = 134 / MUSIC_COST;
   musicFreq = 350;
   ch++;
   break;
   case 'ソ':
   CMT1.CMCOR = 120 / MUSIC_COST;
   musicFreq = 392;
   break;
   case 'ラ':
   CMT1.CMCOR = 89 / MUSIC_COST;
   musicFreq = 440;
   break;
   case 'シ':
   CMT1.CMCOR = 95 / MUSIC_COST;
   musicFreq = 494;
   break;
  }
  if(ch < chf) ch++;
  else ch = 0;
  setCmt3Count(0);
 }
 playSound();
}
unsigned short getMusicFreq(void){
 return musicFreq;
}
//if speed value is smaller, music speed is faster.
void setMusicSpeed(unsigned short speed){
 if(speed < 1) speed = 1;
 musicSpeed = speed;
}
unsigned short getMusicSpeed(void){
 return musicSpeed;
}
void setVolume(unsigned char vol){
 volume = vol;
}

//コンペアマッチタイマの設定
#include "vect.h"
#include "iodefine.h"
#include "global.h"
/*
 「メモ」
 96MHz / 512 = 187500 cycle/s
 96MHz/8/440/256 ラの音
 CMT0.CMCOR = 106;//5860, 46876 - 1;//23438-1;//10000ms //2929-1(1000ms)
 「使用目的」
 CMT0
 CMT1
 CMT2
 CMT3 時間計測
*/
unsigned char cmt3_count;
unsigned char cmt0_count = 0;
//extern MAIN_STATE main_state;
//extern MODE_STATE mode_state;
extern unsigned char main_state;
extern unsigned char sub_state;
extern unsigned short sinNow;

void initCMT0(void);
void initCMT1(void);
void initCMT2(void);
void initCMT3(void);
void initCMT(void);
void timer10m(unsigned char);
void initCMT(void){
 initCMT0();
 initCMT1();
 initCMT2();
 initCMT3();
}
void initCMT0(void){
 SYSTEM.PRCR.WORD = 0xA503;
 SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;//CMT0,1
 SYSTEM.PRCR.WORD = 0xA500;

 CMT.CMSTR0.BIT.STR0 = 0;

 CMT0.CMCR.BIT.CMIE = 0x01;
 CMT0.CMCR.BIT.CKS = 0x01;//8分周・32分周・128分周・512分周

 CMT0.CMCNT = 0;

 //192MHz/4/512 = 93750 cycles
 CMT0.CMCOR = 9375;// 100ms

 ICU.IPR[4].BYTE = 0x06;
 ICU.IER[3].BIT.IEN4 = 1;
}
unsigned char getCmt0Count(void){
 return cmt0_count;
}
void setCmt0Count(unsigned char val){
 cmt0_count = val;
}
//100msごとに割り込み
void Excep_CMT0_CMI0(void){
 if(main_state == 1){
  if(sub_state == 0){
   if(cmt0_count < 50){
    cmt0_count++;
   }else{
    CMT.CMSTR0.BIT.STR1 = 0;
    cmt0_count = 0;
   }
  }
 }else if(main_state == 2){
  S12AD.ADCSR.BIT.ADST = 1;
 }
}
void initCMT1(void){
 SYSTEM.PRCR.WORD = 0xA503;
 SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;//CMT0,1
 SYSTEM.PRCR.WORD = 0xA500;

 CMT.CMSTR0.BIT.STR1 = 0;

 CMT1.CMCR.BIT.CMIE = 0x01;
 CMT1.CMCR.BIT.CKS = 0x00;//8分周・32分周・128分周・512分周

 CMT1.CMCNT = 0;

 //192MHz/2/512 = 187500 cycles
 //CMT1.CMCOR = 18750;// 100ms
 CMT1.CMCOR = 20000;

 ICU.IPR[5].BYTE = 0x03;
 ICU.IER[3].BIT.IEN5 = 1;
}
//音周期用 6000000Hz
void Excep_CMT1_CMI1(void){
 if(main_state == 1){
  if(sinNow < 255) sinNow++;
  else sinNow = 0;
  if(sub_state == 0){
   playSound();
  }else if(sub_state == 1){
   playMusicX(6);
  }
 }else if(main_state == 2){
  if(sinNow < 255) sinNow++;
  else sinNow = 0;
  playMusicX(5);
 }
}
void initCMT2(void){
 SYSTEM.PRCR.WORD = 0xA503;
 SYSTEM.MSTPCRA.BIT.MSTPA14 = 0;//CMT0,1
 SYSTEM.PRCR.WORD = 0xA500;

 CMT.CMSTR1.BIT.STR2 = 0;

 CMT2.CMCR.BIT.CMIE = 0x01;
 CMT2.CMCR.BIT.CKS = 0x03;//8分周・32分周・128分周・512分周

 CMT2.CMCNT = 0;

 //192MHz/4/512 = 12000000 cycles/s
 //1cycle 83.333ns
 //1μs -> 12
 CMT2.CMCOR = 18750;// 100ms

 ICU.IPR[6].BYTE = 0x06;
 ICU.IER[3].BIT.IEN6 = 1;
}
void Excep_CMT2_CMI2(void){

}
void initCMT3(void){
 SYSTEM.PRCR.WORD = 0xA503;
 SYSTEM.MSTPCRA.BIT.MSTPA14 = 0;//CMT0,1
 SYSTEM.PRCR.WORD = 0xA500;

 CMT.CMSTR1.BIT.STR3 = 0;

 CMT3.CMCR.BIT.CMIE = 0x01;
 CMT3.CMCR.BIT.CKS = 0x03;//8分周・32分周・128分周・512分周

 CMT3.CMCNT = 0;

 //192MHz/2/512 = 187500 cycles
 CMT3.CMCOR = 1875;// 10ms

 ICU.IPR[7].BYTE = 0x06;
 ICU.IER[3].BIT.IEN7 = 1;
}
//10msごとに割込み
void Excep_CMT3_CMI3(void){
 cmt3_count++;
}
unsigned char getCmt3Count(void){
 return cmt3_count;
}
void setCmt3Count(unsigned char val){
 cmt3_count = val;
}
void timer10m(unsigned char time){
 CMT3.CMCNT = 0;
 cmt3_count = 0;
 CMT.CMSTR1.BIT.STR3 = 1;
 while(cmt3_count < time);
 CMT3.CMCNT = 0;
 cmt3_count = 0;
 CMT.CMSTR1.BIT.STR3 = 0;
}

コメント

このブログの人気の投稿

SCI の初期化(調歩同期式モード):RX63N

SCI の初期化(調歩同期式モード) 参照:RX63Nハードウェアマニュアル http://resource.renesas.com/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?SCI#TOC_35_3_5 int initSCI0(void){ SYSTEM.PRCR.WORD = 0xA502;//プロテクト解除 SYSTEM.MSTPCRB.BIT.MSTPB31 = 0;//SCI0のモジュールストップ解除 SYSTEM.PRCR.WORD = 0xA500;//プロテクト設定 //トランスミットイネーブルビット(0:シリアル送信動作を禁止、1:許可)  SCI0.SCR.BIT.TE = 0; //レシーブイネーブルビット(0:シリアル受信動作を禁止、1:許可)  SCI0.SCR.BIT.RE = 0; //トランスミットインタラプトイネーブルビット(0:TXI割込み要求を禁止、1:許可)  SCI0.SCR.BIT.TIE = 0; //レシーブインタラプトイネーブルビット(0:RXI及びERI割込み要求を禁止、1:許可)  SCI0.SCR.BIT.RIE = 0; //トランスミットエンドインタラプトイネーブルビット  //(0:TEI割込み要求を禁止、1:許可)  SCI0.SCR.BIT.TEIE = 0;  //P20端子を周辺機能として利用(TXD0) PORT2.PMR.BIT.B0 = 1;  //P20端子を周辺機能として利用(RXD0) PORT2.PMR.BIT.B1 = 1;  //PFSWEビット書き込み禁止ビット(0:PFSWEビットへの書き込みを 許可 ) MPC.PWPR.BIT.B0WI = 0;  //PFSレジスタ書き込み許可ビット(1:PFSレジスタへの書き込みを 許可 ) MPC.PWPR.BIT.PFSWE = 1;  //端子機能制御レジスタの設定 MPC.P20PFS.BYTE = 0x0A;//TXD0を選択 MPC.P21PFS.BYTE = 0x0A;/...

RIIC0(I2C通信設定) : RX63N

#include "iodefine.h" int initRIIC0(void) {  //I2Cモジュールストップ状態の解除  SYSTEM.PRCR.WORD = 0xA502;//モジュールストップレジスタのプロテクト解除  SYSTEM.MSTPCRB.BIT.MSTPB21 = 0;//I2Cモジュールストップ状態の解除  SYSTEM.PRCR.WORD = 0xA500;//モジュールストップレジスタのプロテクト  // set port direction to input  PORT1.PDR.BIT.B3 = 0;// SDA0  PORT1.PDR.BIT.B2 = 0;// SCL0  // set port mode as peripheral device  PORT1.PMR.BIT.B3 = 1;// SDA0  PORT1.PMR.BIT.B2 = 1;// SCL0  // select pin function as RIIC  MPC.PWPR.BIT.B0WI = 0;  MPC.PWPR.BIT.PFSWE = 1;  MPC.P13PFS.BIT.PSEL = 0x0F;// SDA0  MPC.P12PFS.BIT.PSEL = 0x0F;// SCL0  MPC.PWPR.BIT.PFSWE = 0;  MPC.PWPR.BIT.B0WI = 1;  // オープンドレイン設定 外部プルアップ抵抗で出力決めるなら必要  PORT1.ODR0.BIT.B6 = 1;  PORT1.ODR0.BIT.B4 = 1;  //入力プルアップ有効  //PORT1.PCR.BIT.B3 = 1;  //PORT1.PCR.BIT.B2 = 1;  /* RIIC disable for RIIC initial */  RIIC0.ICCR1.BIT.ICE = 0;  RIIC0.ICCR1.BIT.IICR...

IRQ 外部割込みサンプル : RX63N

#include "iodefine.h" #include "global.h" #include "vect.h" extern MAIN_STATE main_state; extern MODE_STATE mode_state; extern unsigned char volume; void initIRQ(void); void initIRQ(void){  int i;  ICU.IER[8].BYTE = 0x00;  //デジタルフィルタ 許可ビット  ICU.IRQFLTE0.BYTE = 0x00;  ICU.IRQFLTC0.WORD = 0xFFFF;//64clockに1回  //デジタルフィルタ 許可ビット IRQ0-7  ICU.IRQFLTE0.BYTE = 0xFF;  PORTD.PDR.BYTE = 0;  PORTD.PMR.BYTE = 0x00;//ポートモードレジスタ(0:汎用入出力ポート, 1:周辺機能)  //マルチファンクションピンコントローラ  MPC.PWPR.BYTE &= ~0x80;//PFSプロテクト解除  MPC.PWPR.BYTE |= 0x40;  MPC.PD0PFS.BYTE = 0x40;  MPC.PD1PFS.BYTE = 0x40;  MPC.PD2PFS.BYTE = 0x40;  MPC.PD3PFS.BYTE = 0x40;  MPC.PD4PFS.BYTE = 0x40;  MPC.PD5PFS.BYTE = 0x40;  MPC.PD6PFS.BYTE = 0x40;  MPC.PD7PFS.BYTE = 0x40;  MPC.PWPR.BYTE &= ~0x40;  MPC.PWPR.BYTE |= 0x80;//PFSプロテクト設定  ICU.IRQCR[0].BIT.IRQMD = 1;  ICU.IRQCR[1].BIT.IRQMD = 1;  ICU.IRQCR[2].BIT.IRQMD =...