#include #include #include #include LiquidCrystal_I2C lcd(0x27,16,2); //各定数の定義 const byte ENC_A = 2; //Rotary encoder A const byte ENC_B = 3; //Rotary encoder B const byte SDATA = 4; //AD9834 SDATA const byte SCLK = 5; //AD9834 SCLK const byte FSYNC = 6; //AD9834 FSYNC const byte SW_STEP = 7; //Frequency Change Step const byte SW_RIT = 10; //Rit on/off const byte SW_MW = 9; //Memory Write const byte SW_MR = 8; //Memory Read const byte SW_TX = 12; //Tx/Rx SW_TX=0 Transmit const long IF_FREQ = 9010900; //中間周波数 const long LOW_FREQ = 7000000; //下限周波数 const long HI_FREQ = 7200000; //上限周波数 const int LOW_RIT = -5000; //RIT下限 const int HI_RIT = 5000; //RIT上限 const int EEPadd = 0; //EEPROM address //各変数の初期値 int_fast32_t FREQ = 7015000; long STEP = 100; long DDS_Data = FREQ +IF_FREQ; int RIT_FREQ = 0; int time = 0; int once = 0; int lastVal = HIGH; //フラッグ初期値 byte Flg_Rit = 0; //Ritフラッグ byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders Rotary r = Rotary(ENC_A,ENC_B); //ENC_A=2,ENC_B=3 void setup() { // TIMSK0= 0; pinMode(SDATA,OUTPUT); pinMode(SCLK,OUTPUT); pinMode(FSYNC,OUTPUT); pinMode(SW_STEP,INPUT_PULLUP); pinMode(SW_RIT,INPUT_PULLUP); pinMode(SW_MW,INPUT_PULLUP); pinMode(SW_MR,INPUT_PULLUP); pinMode(SW_TX,INPUT_PULLUP); //ピン変化割り込みの設定 PCICR |= (1 << PCIE2); PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); sei(); //割り込み許可 //LCD初期化 lcd.begin(); lcd.backlight(); lcd.clear(); //初期画面表示 Fnc_Lcd(); Fnc_Step_Disp(); } void loop() { if ((PINB >> 4) == LOW){ DDS_Data = FREQ; lcd.setCursor(0,0); lcd.print("T"); }else{ lcd.setCursor(0,0); lcd.print(" "); if(digitalRead(SW_STEP) == LOW) { time++; lastVal = LOW; }else{ if(lastVal == LOW && !once){ if(time>1){ Fnc_Stp(); } } lastVal == HIGH; time = 0; once = 0; } if(time>12){ time = 13; if(!once){ Fnc_Rit(); once = 1; } } if(digitalRead(SW_MW) == LOW){ Fnc_Eep_Save(FREQ,EEPadd); } if(digitalRead(SW_MR) == LOW){ FREQ = Fnc_Eep_Load(EEPadd); } if (Flg_Rit == 1){ DDS_Data = FREQ + IF_FREQ +RIT_FREQ; }else{ DDS_Data = FREQ + IF_FREQ; } } Fnc_Dds(DDS_Data); Fnc_Lcd(); Fnc_Rit_Disp(); // delayMicroseconds(100); } //ロータリーエンコーダ処理(ISR=割り込みサービスルーチン) ISR(PCINT2_vect){ unsigned char result = r.process(); if(result){ if(result == DIR_CW){ if (Flg_Rit == 1){ RIT_FREQ =RIT_FREQ + 10; }else{ FREQ = FREQ + STEP; } }else{ if (Flg_Rit == 1){ RIT_FREQ = RIT_FREQ - 10; }else{ FREQ = FREQ - STEP; } } } RIT_FREQ = constrain(RIT_FREQ,LOW_RIT,HI_RIT); FREQ = constrain(FREQ,LOW_FREQ,HI_FREQ); } //DDSにデータを送る。 void Data_send(unsigned long data){ for(unsigned char i = 0;i<16;i++){ if(data & 0x8000){ PORTD |= _BV(4); //SDATA PD4 }else{ PORTD &= ~(_BV(4)); //SDATA } PORTD &= ~(_BV(5)); //SCLK PORTD |= _BV(5); //SCLK data <<= 1; } } void Fnc_Dds(long frequency){ unsigned long wrk = frequency << 2; unsigned int wrk1,wrk2,wrk3; wrk1 = 0x2000; wrk2 = wrk & 0x3fff; //wrkの下位14ビットをwrk2にセット wrk2 = wrk2 | 0x4000; //D14に1をセット(FREQ0指定) wrk3 = wrk >> 14; //wrkを右に14ビットシフト wrk3 = wrk3 & 0x3fff; //wrkの上位14ビットをwrk3にセット wrk3 = wrk3 | 0x4000; //D14に1をセット(FREQ0指定) PORTD |= _BV(5); //SCLK,HIGH PD5 PORTD &= ~_BV(6); //FSYNC,LOW PD6 Data_send(wrk1); Data_send(wrk2); Data_send(wrk3); PORTD |= _BV(6); } //STEPボタンが押された時の処理 void Fnc_Stp(){ if(STEP == 10){ STEP = 1000; } else{ STEP= STEP / 10; } Fnc_Step_Disp(); while(digitalRead(SW_STEP) == LOW){ delay(10); } } //RITボタンが押された時の処理 void Fnc_Rit(){ if (Flg_Rit == 1){ Flg_Rit = 0; }else{ Flg_Rit = 1; } Fnc_Rit_Disp(); while(digitalRead(SW_RIT) == LOW){ delay(10); } } void Fnc_Lcd(){ millions = int(FREQ/1000000); hundredthousands = ((FREQ/100000)%10); tenthousands = ((FREQ/10000)%10); thousands = ((FREQ/1000)%10); hundreds = ((FREQ/100)%10); tens = ((FREQ/10)%10); ones = ((FREQ/1)%10); lcd.setCursor(2,0); lcd.print(millions); lcd.print("."); lcd.print(hundredthousands); lcd.print(tenthousands); lcd.print(thousands); lcd.print("."); lcd.print(hundreds); lcd.print(tens); lcd.print(ones); lcd.print("MHz"); } //STEP表示 void Fnc_Step_Disp(){ lcd.setCursor(0,1); switch(STEP){ case 10: lcd.print(" 10Hz"); break; case 100: lcd.print("100Hz"); break; case 1000: lcd.print(" 1kHz"); break; } } //RIT表示 void Fnc_Rit_Disp(){ char Rit_F[5]; lcd.setCursor(8,1); if (Flg_Rit == 1){ lcd.print("RIT"); lcd.setCursor(11,1); sprintf(Rit_F,"%5d",RIT_FREQ); lcd.print(Rit_F); }else{ RIT_FREQ = 0; lcd.setCursor(8,1); lcd.print(" "); } } // 4byteをEEPROMにSAVE void Fnc_Eep_Save(long value,int address){ address += 3; for (int i=0;i<4;i++){ byte toSave = value & 0xFF; if(EEPROM.read(address) != toSave); EEPROM.write(address,toSave); value = value >> 8; address --; } delay(10); while(digitalRead(SW_MW) == LOW){ delay(10); } } // 4byteをEEPROM からLOAD long Fnc_Eep_Load(int address){ long value = 0; for (int i=0; i<4;i++){ value = value | EEPROM.read(address); if (i<3){ value = value << 8; address ++; } delay(10); while(digitalRead(SW_MR) == LOW){ delay(10); } } return value; }