Fumio Hirose
/
DDS-VFO
First Programm.HF Lo Band VFO with LPC1114 and AD9851 module.Built in ELEKEY.Using ACM1602NI.
Diff: main.cpp
- Revision:
- 0:5cdf1a556e60
- Child:
- 1:ee890adf56ea
diff -r 000000000000 -r 5cdf1a556e60 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Nov 13 14:54:43 2016 +0000 @@ -0,0 +1,596 @@ +#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" ); +} \ No newline at end of file