キッチンタイマーの製作(8)確認音の音程を変える
キッチンタイマーのタイムアップ時に、PWM機能を応用したオルゴールを鳴らす機能を追加したいと思います。
①まずは、TMR2をPeripheralsに追加しTimer Periodを1msに設定します。
②今回は、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);