// AD9834SG #include #include "rotary.h" #include #define DEBUG 1 //デバッグモード(シリアル出力) //SPI Arduino UNO // AD9834 // 13 → SCK H/W Pin CLK // 12 ← MISO H/W Pin xxx // 11 → MOSI H/W Pin SDA // 10 → CS FSY LOWで選択 // #define PIN_RSW 4 //ロータリースイッチピン番号 #define PIN_RRIGHT 2 //ロータリー右回転 #define PIN_RLEFT 3 //ロータリー左回転 #define DSP_LINE1 28 //上行表示 #define DSP_LINE2 60 //下行表示 #define DSP_LINEC 44 //中央表示 #define CMD_RESET 0x0100 //内部レジスタを0にリセット #define CMD_B28 0x2000 //二つの連続した書き込みで周波数レジスタにロード #define CMD_OPBITEN 0x0020 //ピンSIGN BIT OUTをイネーブル #define CMD_SIGNPIB 0x0010 //1:方形波を出力 #define CMD_DIV2 0x0008 //1:直接出力,0:2分周出力 #define CMD_MODE 0x0002 //1:三角波出力 #define CMD_CTRL (CMD_B28|CMD_OPBITEN|CMD_SIGNPIB|CMD_DIV2) #define SEL_FREQ0 0x4000 //FREQ0レジスタ・ビット #define SEL_FREQ1 0x8000 //FREQ1レジスタ・ビット #define PIN_FSYNC 10 //CS Pin Rotary r = Rotary(PIN_RRIGHT, PIN_RLEFT); SPISettings settings(SPISettings(1000000, MSBFIRST, SPI_MODE2)); //各変数の初期値 unsigned long FREQ = 10000000; //DDS周波数初期値=7MHz unsigned long STEP = 100000; //STEP周波数初期値=100kHz //ロータリーエンコーダ処理 ISR(PCINT2_vect) { cli(); unsigned char result = r.process(); if(result){ if(result == DIR_CW) { FREQ += STEP; } else{ FREQ -= STEP; } dispFreq(); } sei(); } void setup(void) { cli(); #ifdef DEBUG Serial.begin(9600); #endif //ロータリーエンコーダ pinMode(PIN_RSW, INPUT_PULLUP); pinMode(PIN_RRIGHT, INPUT_PULLUP); pinMode(PIN_RLEFT, INPUT_PULLUP); //割込み設定 PCICR |= (1<>8); // MSB Reset SPI.transfer(CMD_RESET&0xff); // LSB SPI.transfer(CMD_CTRL>>8); // MSB Control register SPI.transfer(CMD_CTRL&0xff); // LSB digitalWrite(PIN_FSYNC, HIGH); //チップ・セレクト(OFF) SPI.endTransaction(); dispStep(); dispFreq(); sei(); } //周波数表示 void dispFreq() { #ifdef DEBUG Serial.print("FREQ = "); Serial.print(FREQ); Serial.println(" Hz"); #endif /* char str[10]; sprintf(str, "%8lu Hz", FREQ); //0 - 75,000,000 u8g.setFont(u8g_font_helvR14); u8g.setPrintPos(4, DSP_LINE2); u8g.print(str); */ setFreq(); } //STEP表示 void dispStep() { char *str; switch(STEP) { case 10: str = (char *)"10Hz"; break; case 100: str = (char *)"100Hz"; break; case 1000: str = (char *)"1kHz"; break; case 10000: str = (char *)"10kHz"; break; case 100000: str = (char *)"100kHz"; break; case 1000000: str = (char *)"1MHz"; break; } /* u8g.setFont(u8g_font_helvR24); u8g.setPrintPos(4, DSP_LINE1); u8g.print(str); */ #ifdef DEBUG Serial.print("STEP = "); Serial.println(str); #endif } void loop(void) { int maintsw = digitalRead(PIN_RSW); if(maintsw == LOW) { while(digitalRead(PIN_RSW) == LOW) delay(100); //ステップ変更 10 - 1000000 if(STEP == 1000000) { STEP = 1000; } else { STEP *= 10; } dispStep(); } delay(100); } void setFreq() { cli(); //連続アドレス書き込みで上位下位14bitになる uint32_t Freq = FREQ /100 * 358; uint32_t Flsb = (Freq & 0x3fff) | SEL_FREQ0; //28ビットの下半分の14ビット分 uint32_t Fmsb = ((Freq>>14) & 0x3fff) | SEL_FREQ0; //上半分の14ビット分 SPI.beginTransaction(settings); digitalWrite(PIN_FSYNC, LOW); //チップ・セレクト(ON) SPI.transfer(Flsb>>8); // frequency register 0 LSB SPI.transfer(Flsb&0xff); SPI.transfer(Fmsb>>8); // frequency register 0 MSB SPI.transfer(Fmsb&0xff); digitalWrite(PIN_FSYNC, HIGH); //チップ・セレクト(OFF) SPI.endTransaction(); sei(); }