2024年6月28日金曜日

NCOをMCCなしで実装 :: PIC16F18313(XREAさんより)

 // 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 件のコメント:

コメントを投稿