//rob@m0dts.co.uk //21-May -2017 // //Option to load Frequency to Elcom style Synthesiser via normal interface, inc. Microsource. //Option to load direct to CPLD in Microsource SNP101341001, allowing wider coverage. //use define below to select programming method!! #define DFS //comment this line out to use direct cpld programming //define spi pins to PLL D ports char clk = 2; //connect to Synth D or SIL connector for DFS type programming, or direct tp CPLD for Microsource module char data = 3; char load = 4; //Variables int regval; int X,A,Frac,offset; int N,M,Fpd; float Freq; String DFS_Freq; void setup() { //setup pins as outputs pinMode(clk, OUTPUT); pinMode(data, OUTPUT); pinMode(load, OUTPUT); //initialise pin levels digitalWrite(load, 0); digitalWrite(clk, 0); delay(1000); //Milliseconds, longer than 1 second maybe required at startup Serial.begin(9600); } void loop() { #ifdef DFS //Direct PIC control of freq - Elcom style! , 11.2 - 12.0GHz Freq = 11200000; //specify freq in KHz, Synth PIC will determine closest step DFS_Freq = String(Freq*3); //12000*3 produces 12GHz write_DFS(DFS_Freq,8); #else ///////////////////////////////////////////////////////////////////////////////// //Direct Writing to CPLD //Max freq 13.4GHz is M=14,A=15,Frac=24 //Min freq 9.52GHz is M=10,A=9,Frac=0 Fpd=10; //10MHz comparison freq (R regsiter is fixed) //11.200GHz = M=13,A=0,Frac=0 //10.366666GHz = M=11,A=9,Frac=48 //12.025GHz = M=14,A=0,Frac=24 M=14; //10-14 allowed A=0; //0-15 allowed offset = 24; //0-80MHz, only nearest ~3.333MHz step will result //limit fractional when all A register bits are on if(A==15){ offset=0; } Frac=((float)offset/80.0)*24; //Serial.println(Frac); //Calc freq N=(M+1)*10+A; Freq=N*Fpd; //Print frequency on Arduino Serial port if((Frac%2) !=0){ Serial.print((Freq*8)+(Frac*3.333333)+1.6666666,3); //odd Fractional values need to add 1.66666MHz }else{ Serial.print((Freq*8)+(Frac*3.333333),3); } Serial.println("MHz"); //Generate cpld Serial programming bits //generate top three bits (PLL M setting) of serial word to cpld, odd behaviour! if(M==13){X=3;} if(M==14){X=0;} if(M==12){X=2;} regval = X<<9 | A<<5 | (int) Frac; write_cpld(regval,12); //write 12 bits to Altera CPLD for Q3236 PLL. 3 bits=part of M reg , 4 bits=A Reg, 5 bits=Frac of A //////////////////////////////////////////////////////////////////////////////////// #endif for(;;){ //nothing } } // function to send 8x 4bits register to device void write_DFS(String val, int len){ digitalWrite(load, 0); delayMicroseconds(10); for(int i=len-1;i>=0;i--){ for(int a=0;a<4;a++){ digitalWrite(data,(val[i]>>a)&1); delayMicroseconds(10); digitalWrite(clk, 1); delayMicroseconds(10); digitalWrite(clk, 0); } } delayMicroseconds(10); digitalWrite(load, 1); } //Function to send bits to Microsource cpld void write_cpld(int val, int len){ digitalWrite(load, 0); delayMicroseconds(10); for(int i=len-1;i>=0;i--){ digitalWrite(data,(val>>i)&1); delayMicroseconds(10); digitalWrite(clk, 1); delayMicroseconds(10); digitalWrite(clk, 0); } //extra clock pulse seems to be required?? delayMicroseconds(10); digitalWrite(clk, 1); delayMicroseconds(10); digitalWrite(clk, 0); delayMicroseconds(10); digitalWrite(load, 1); delayMicroseconds(10); digitalWrite(load, 0); }