Fumio Hirose
/
DDS-VFO
First Programm.HF Lo Band VFO with LPC1114 and AD9851 module.Built in ELEKEY.Using ACM1602NI.
main.cpp
- Committer:
- jp1nom
- Date:
- 2016-11-13
- Revision:
- 0:5cdf1a556e60
- Child:
- 1:ee890adf56ea
File content as of revision 0:5cdf1a556e60:
#include "mbed.h" #include "I2cLCD.h" DigitalOut DATA(dp9); DigitalOut W_CLK(dp17); DigitalOut FQ_UD(dp11); DigitalOut RESET(dp26); //previously known as dp26 DigitalOut LED(dp14); DigitalOut PTT_OUT(dp18); DigitalIn PTT_ON(dp1); DigitalIn DOT(dp4); DigitalIn BAR(dp6); DigitalOut KEY(dp13); DigitalIn BAND_SW(dp10); DigitalIn JOG_1(dp2); DigitalIn JOG_2(dp28); //previously known as dp28 DigitalIn JOG_3(dp25); DigitalIn JOG_4(dp16); double FQX; double FQD; double FQD_18 = 1810000; double FQD_19 = 1907500; double FQD_351 = 3500000; double FQD_352 = 3599000; double FQD_353 = 3680000; double FQD_381 = 3702000; double FQD_382 = 3745000; double FQD_383 = 3791000; double FQD_4 = 4630000; double FQD_7 = 7000000; double FQD_10 = 10100000; double FQ; double FQ_18 = 43191352; double FQ_19 = 45517913; double FQ_351 = 83519190.5; double FQ_352 = 85881750; double FQ_353 = 87814470; double FQ_381 = 88339811; double FQ_382 = 89365820; double FQ_383 = 90463357; double FQ_4 = 110484088; double FQ_7 = 167038250; double FQ_10 = 241012230; double f1 = 7000000; double f2 = 7200000; double f1_CW = 7000000; double f2_CW = 7045000; int BAND; double IF; double STEPD; double STEP = 2.386; float wt = 0.1; const int a=1; int s; Ticker deley; float del = 0.1; void DDS(void); void DDS_U(void); void DDS_D(void); void DDS_T(void); void GET_LCD_DATA(void); void STEPS(void); void QSY(void); void STEPSS(void); void JOG(void); void DDS_CW(void); void PTT_OFF(void); I2cLCD lcd(dp5, dp27); int main() { KEY = 0; STEPD = 10; BAND = 7; FQD = FQD_7; FQ = FQ_7; IF = 10857458;//IF 455KHz // IF = 255329316.50856;// IF 10.7MHz // lcd.locate(1,1); // lcd.printf("455K"); // lcd.locate(0,1); // lcd.printf("10.7M"); LED = 0; s = 1; RESET=0; RESET=1; wait_us(100); RESET=0; DATA=0; FQ_UD=0; W_CLK=0; W_CLK=1; wait_us(100); W_CLK=0; FQ_UD=1; wait_us(100); FQ_UD=0; wait_us(100); GET_LCD_DATA(); FQX = FQ + IF; DDS(); DDS(); lcd.locate(8,0); lcd.printf("0MHz"); lcd.locate(12,1); lcd.printf("1KHz"); lcd.locate(14,0); lcd.printf("RX"); lcd.locate(0,1); lcd.printf("Mode:"); while(1) { if (PTT_ON==0) {DDS_T();} // if (FQ_UP==0) {DDS_U();} // if (FQ_DOWN==0) {DDS_D();} // if (FSTEP==0) {STEPS();} if (DOT==0) {DDS_CW();} if (BAR==0) {DDS_CW();} if (BAND_SW==0) {QSY();} if (JOG_1==1) {JOG();} } } void DDS(void) { unsigned long int DDS_DATA; unsigned long int BIT_DATA; int i = 0; DDS_DATA = FQX; for (i=0; i<32; i++) { BIT_DATA = DDS_DATA & 1; if(BIT_DATA==1) { DATA = 1; } else { DATA = 0; } W_CLK = 1; DDS_DATA = DDS_DATA >> 1; wait_us(10); W_CLK = 0; wait_us(10); } DDS_DATA = a; for (i=0; i<8; i++) { BIT_DATA = DDS_DATA & 1; if(BIT_DATA==1) { DATA = 1; } else { DATA = 0; } W_CLK = 1; DDS_DATA = DDS_DATA >> 1; wait_us(10); W_CLK = 0; wait_us(10); } FQ_UD = 1; wait_us(10); FQ_UD = 0; wait_us(10); } void DDS_U(void) { // if (FQD <= f1 && FQD <= f2) { if (s==0) { if ((FQD + STEPD) <= f2) { FQD = FQD + STEPD; FQ = FQ + STEP * 100; } }else{ if ((FQD + STEPD * 100) <= f2) { FQD = FQD + STEPD * 100; FQ = FQ + STEP * 10000; } } // } GET_LCD_DATA(); FQX = FQ + IF; DDS(); wait(wt); } void DDS_D(void) { // if (FQD <= f1 && FQD <= f2) { if (s==0) { if ((FQD - STEPD) >= f1) { FQD = FQD - STEPD; FQ = FQ - STEP * 100; } }else{ if ((FQD - STEPD * 100) >= f1) { FQD = FQD - STEPD * 100; FQ = FQ - STEP * 10000; } } // } GET_LCD_DATA(); FQX = FQ + IF; DDS(); wait(wt); } void DDS_T(void) { deley.detach(); if (FQD > f1 && FQD < f2) { GET_LCD_DATA(); lcd.locate( 14, 0 ); lcd.printf( "T" ); FQX = FQ; DDS(); LED = 1; PTT_OUT = 1; while( PTT_ON == 0) {} PTT_OUT = 0; LED = 0; FQX = FQ + IF; DDS(); }else{ LED=1; wait(0.2); LED=0; wait(0.2); } GET_LCD_DATA(); lcd.locate( 14,0 ); lcd.printf( "R" ); } void GET_LCD_DATA(void) { char f[9]; sprintf(f,"%8.5lf",FQD / 1000000); lcd.locate( 0,0 ); lcd.printf( f ); if (FQD >= f1_CW && FQD < f2_CW) { lcd.locate( 5,1 ); lcd.printf("CW "); }else{ if(FQD >= f2_CW && FQD < f2 ) { lcd.locate( 5,1 ); lcd.printf("Phone"); }else{ lcd.locate( 5,1 ); lcd.printf("none "); } } } void STEPS( void ) { if (s==1) { s = 0; lcd.locate(13,1); lcd.printf("0"); }else{ s = 1; lcd.locate(13,1); lcd.printf("K"); } wait(0.3); } void QSY(void) { switch (BAND) { case 7: BAND = 10; FQD_7 = FQD; FQD = FQD_10; FQ_7 = FQ; FQ = FQ_10; f1 = 10100000; f2 = 10150000; f1_CW = 10100000; f2_CW = 10150000; break; case 10: BAND = 18; FQD_10 = FQD; FQD = FQD_18; FQ_10 = FQ; FQ = FQ_18; f1 = 1810000; f2 = 1825000; f1_CW = 1810000; f2_CW = 1825000; break; case 18: BAND = 19; FQD_18 = FQD; FQD = FQD_19; FQ_18 = FQ; FQ = FQ_19; f1 = 1907500; f2 = 1912500; f1_CW = 1907500; f2_CW = 1912500; break; case 19: BAND = 351; FQD_19 = FQD; FQD = FQD_351; FQ_19 = FQ; FQ = FQ_351; f1 = 3500000; f2 = 3575000; f1_CW = 3500000; f2_CW = 3535000; break; case 351: BAND = 352; FQD_351 = FQD; FQD = FQD_352; FQ_351 = FQ; FQ = FQ_352; f1 = 3599000; f2 = 3612000; f1_CW = 3599000; f2_CW = 3599000; break; case 352: BAND = 353; FQD_352 = FQD; FQD = FQD_353; FQ_352 = FQ; FQ = FQ_353; f1 = 3680000; f2 = 3687000; f1_CW = 3680000; f2_CW = 3680000; break; case 353: BAND = 381; FQD_353 = FQD; FQD = FQD_381; FQ_353 = FQ; FQ = FQ_381; f1 = 3702000; f2 = 3716000; f1_CW = 3702000; f2_CW = 3702000; break; case 381: BAND = 382; FQD_381 = FQD; FQD = FQD_382; FQ_381 = FQ; FQ = FQ_382; f1 = 3745000; f2 = 3770000; f1_CW = 3745000; f2_CW = 3745000; break; case 382: BAND = 383; FQD_382 = FQD; FQD = FQD_383; FQ_382 = FQ; FQ = FQ_383; f1 = 3791000; f2 = 3805000; f1_CW = 3791000; f2_CW = 3791000; break; case 383: BAND = 4; FQD_383 = FQD; FQD = FQD_4; FQ_383 = FQ; FQ = FQ_4; f1 = 4629999; f2 = 4630001; f1_CW = 4630000; f2_CW = 4630001; break; case 4: BAND = 7; FQD_4 = FQD; FQD = FQD_7; FQ_4 = FQ; FQ = FQ_7; f1 = 7000000; f2 = 7200000; f1_CW = 7000000; f2_CW = 7045000; break; default: BAND = 7; FQD = FQD_7; FQ = FQ_7; break; } GET_LCD_DATA(); FQX = FQ + IF; DDS(); wait(0.3); } void STEPSS( void ) { if (s==0) { lcd.locate(13,1); lcd.printf("0"); }else{ lcd.locate(13,1); lcd.printf("K"); } // wait(0.3); } void JOG( void ) { int jog; deley.detach(); jog = JOG_2 * 4 +JOG_3 * 2 + JOG_4 * 1; switch( jog ) { case 2: wt = 0.3; s = 0; lcd.locate(12,0); lcd.printf("> "); STEPSS(); DDS_U(); lcd.locate(12,0); lcd.printf(" "); break; case 6: wt = 0.05; s = 0; lcd.locate(12,0); lcd.printf(">>"); STEPSS(); DDS_U(); lcd.locate(12,0); lcd.printf(" "); break; case 4: wt = 0.3; s =1; lcd.locate(12,0); lcd.printf("> "); STEPSS(); DDS_U(); lcd.locate(12,0); lcd.printf(" "); break; case 0: wt = 0.05; s =1; lcd.locate(12,0); lcd.printf(">>"); STEPSS(); DDS_U(); lcd.locate(12,0); lcd.printf(" "); break; case 3: wt = 0.3; s = 0; lcd.locate(12,0); lcd.printf(" <"); STEPSS(); DDS_D(); lcd.locate(12,0); lcd.printf(" "); break; case 7: wt = 0.05; s = 0; lcd.locate(12,0); lcd.printf("<<"); STEPSS(); DDS_D(); lcd.locate(12,0); lcd.printf(" "); break; case 5: wt = 0.3; s =1; lcd.locate(12,0); lcd.printf(" <"); STEPSS(); DDS_D(); lcd.locate(12,0); lcd.printf(" "); break; case 1: wt = 0.05; s =1; lcd.locate(12,0); lcd.printf("<<"); STEPSS(); DDS_D(); lcd.locate(12,0); lcd.printf(" "); break; default: wt = 0.05; s =1; STEPSS(); DDS_D(); lcd.locate(12,0); lcd.printf(" "); break; } } void DDS_CW(void) { if (FQD > f1 && FQD < f2) { deley.detach(); GET_LCD_DATA(); lcd.locate( 14, 0 ); lcd.printf( "T" ); FQX = FQ; DDS(); LED = 1; PTT_OUT = 1; KEY = 1; if (BAR==0) { wait(3.5*del); KEY = 0; wait(del); }else{ if (DOT==0) { wait(del); KEY = 0; wait(del); } } deley.attach(&PTT_OFF,4*del); }else{ LED=1; wait(0.2); LED=0; wait(0.2); } } void PTT_OFF(void) { PTT_OUT = 0; LED = 0; KEY = 0; FQX = FQ + IF; DDS(); GET_LCD_DATA(); lcd.locate( 14,0 ); lcd.printf( "R" ); }