// http://machoto2.g2.xrea.com/page/P16F18313/P18313_a23.htm
/* File: NCO sample * System ClockはConfigで内部1MHzに設定 * NCO を RA2 に出力 * PIC16F18313 * Created on 2021-12-18 **************************************/ #include <xc.h> #define _XTAL_FREQ 1000000 // delay_ms(x) のための定義 #define SW RA5 // Push SW // 音の高さを決める定数 const int inc_tbl[] = { // Do, Re, Mi, Fa, So, Ra, Si, Do 0x225,0x268,0x2B3,0x2DC,0x336,0x39B,0x40C,0x449 }; #pragma config FEXTOSC = OFF,RSTOSC = HFINT1 // HFINTOSC (1MHz) #pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF #pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF #pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON #pragma config DEBUG = OFF #pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF void main(void) { char idx = 0; LATA = 0; TRISA = 0b101011; // PORTA5を入力に設定 PORTA3::RESET ANSELA = 0; // 全てのpinをデジタルに設定 WPUA = 0b111111; // PORTA入力に弱プルアップ
// なぜかOPTION_REGの設定が不要 // NCO 設定 **************************************** NCO1CLK = 0b00000001; // Fosc (1 MHz)がクロック RA2PPS = 29; // RA2にNCO出力 while(1){ NCO1CON = 0b10000000; // NCO ON FDCモード for(char i = 0;i < 8;i++){ // オクターブ(8回)繰り返し NCO1INCH = inc_tbl[i] >> 8; // 音階データをセット NCO1INCL = inc_tbl[i] & 0xFF; // 音階データをセット __delay_ms(500); // 500ms演奏 } NCO1CON = 0; // NCO OFF while(SW); // SWが押されるのを待つ } }
0 件のコメント:
コメントを投稿