組込み系システム開発室by藤原技研M

製作中の組込み機器や気になる開発ツールなどを中心に記事を書いています。

キッチンタイマーの製作(8)確認音の音程を変える

キッチンタイマーのタイムアップ時に、PWM機能を応用したオルゴールを鳴らす機能を追加したいと思います。
①まずは、TMR2をPeripheralsに追加しTimer Periodを1msに設定します。


f:id:fujiharagiken:20181219100020p:plain
TMR2の設定


②今回は、RP14(25Pin)をキャプチャーコンペア出力1に割り当てます。
マニュアルのSELECTABLE OUTPUT SOURCES (MAPS FUNCTION TO OUTPUT)を参考にします。

(Output Function Number) (Function) (Output Name)
ーーーーーーーーーーーーーーーーーー
0 NULL(2) Null
1 C1OUT Comparator 1 Output
2 C2OUT Comparator 2 Output
3 U1TX UART1 Transmit
4 U1RTS(3) UART1 Request To Send
5 U2TX UART2 Transmit
6 U2RTS(3) UART2 Request To Send
7 SDO1 SPI1 Data Output
8 SCK1OUT SPI1 Clock Output
9 SS1OUT SPI1 Slave Select Output
10 SDO2 SPI2 Data Output
11 SCK2OUT SPI2 Clock Output
12 SS2OUT SPI2 Slave Select Output
18 OC1 Output Compare 1               ←これを使用する
19 OC2 Output Compare 2
20 OC3 Output Compare 3
21 OC4 Output Compare 4
22 OC5 Output Compare 5
23-28 (unused) NC
29 CTPLS CTMU Output Pulse
30 C3OUT Comparator 3 Output
31 (unused) NC

ポートRP14の設定Resistor(RP14R)は、RPOR7レジスタにあり、そのレジスタを18に設定するため、
pin_manager.cのvoid PIN_MANAGER_Initialize(void)関数の最後に以下の処理を追加します。

	/**************************************************************************
	* Set the PPS
	***************************************************************************/
	__builtin_write_OSCCONL(OSCCON & 0xbf); // unlock PPS
	
	//------------------------------------
	// PWM関係の設定 by fujihara
	//------------------------------------
	RPOR7bits.RP14R = 18;		// RP14ピンの機能を, 18:OC1に割り当てる
	
	OC1CON1bits.OCTSEL = 0;		// 0:Timer2 Clock
	
	//OC1CON1bits.OCM = 0b011;	// 3:シングルコンペア連続パルスモード(Fullカウントでトグルする)
	//OC1CON1bits.OCM = 0b110;	// 6:OC1でエッジアラインPWMモード
	OC1CON1bits.OCM = 0b101;	// 5:ダブルコンペア連続パルス(OC1RでHigh,OC1RSでLow)
	
	OC1R            = PR2/2;	// Highになるタイミング(仮の値)
	OC1RS           = PR2;		// Low になるタイミング(仮の値)
				// 実際の回路はトランジスタのためHigh/Lowが反転する
	
	OC1CON2bits.OCTRIS = 0;		// 0:出力コンペアモジュールが駆動する
				// 1:OC1ピンを3ステートにする
	
	__builtin_write_OSCCONL(OSCCON | 0x40); // lock   PPS
	/****************************************************************************/
	


③main.cに以下の発音関数を追加します。

/**
* 発音関数
* @param freq:周波数(Hz)  例:A4の時、440 (Hz)
*/
void tone(int freq) {

	if (freq != NON) {
#ifdef __24FJ128GB204_H
		PR2 = 8000000 / freq; //発音
#else
		PR2 = 4000000 / freq; //発音
#endif
		OC1R = PR2 / 2; // Highになるタイミング
		OC1RS = PR2; // Low になるタイミング
	} else {
		PR2 = 0; //発音停止
	}
}

④ボタンが押されたタイミングで以下の処理を行うと、ドミソドという音が発音されます。

	
	tone(131); //C3(ド)
	__delay_ms(250);
	tone(165); //E3(ミ)
	__delay_ms(250);
	tone(196); //G3(ソ)
	__delay_ms(250);
	tone(262); //C4(ド)
	__delay_ms(250);
	tone(0);