「・・・その6」でやっと細かな周波数設定に辿り着きました、と云う事に成っていますが、実際の時系列は違います。
本当はかなり前の時期に1Hzステップのプログラムは完成しています。
Si5351Aにのめり込むキッカケが当にそれで、自分で其のプログラムを「考える」からスタートしました。
今考えても良く解らない(作った本人でも)プログラム関数を下に・・・
FK(){ // 発振周波数計算 P/Q***
unsigned int SS;
SS=1536+(B1*128/499989);
P1L=SS&255;P1H=(SS>>8)&255;
SS=(B1-((B1*128/499989)*499989/128));
P2L=SS&255;P2H=(SS>>8)&255;
P3L=66;P3H=15;
Q1H=23;Q3L=1;
}
作っている時は夢中でしたので解っていたのでしょうが、今解説しろと云われても・・・???です。
ただ、プログラムですからデタラメに組んで動く訳はありません。
おそらく脳内に別の「私」が現れて作ったのでしょう。
同じプログラムが在ったら「ごめんなさい」です。
B1と云う変数が出て来ますが、此れは [F]から変換します。
FB(){ // F-->B1変換***
B1=F*(1<<N)-7999828;
}
ついでに周波数スパン設定のプログラムも・・・
FS(){ // 周波数スパン***
if (F>=20000000) F=20000000;
if (F<=2500000) F=2500000;
if (F>=10000000) {N=0;goto laop;}
if (F>=5000000) {N=1;goto laop;}
if (F>=2500000) {N=2;goto laop;}
laop: ER=ER;
}
得意な? [goto]命令を使っています。
以上をもって、全てのプログラム関数は出尽くしました。
最後にメイン部分を下に・・・
/**Si5351**2.5-20MHz/1HzSTEP*12F683
周波数補正あり**/
#include <pic.h>
__CONFIG(FOSC_INTOSCIO&WDTE_OFF
&PWRTE_ON&BOREN_ON&MCLRE_OFF
&CP_OFF&IESO_OFF&FCMEN_OFF);
#define _XTAL_FREQ 8000000
#define SDA GP1
#define SCL GP0
#define TRISSDA TRISIO1
unsigned char data,regi,cmd,ER,EL,JJ,N;
unsigned char P1H,P1L,P2H,P2L,P3H,P3L;
unsigned char Q1H,Q3L;
unsigned char h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long B1,F,J;
void main(){
OSCCON=0b01110000;
ANSEL =0b00000000;
CMCON0=0b00000111;
TRISIO=0b00111100;
GPIO =0b00000000;
F=15000000;J=100;JJ=133; //スタート画面設定 F:発振周波数
FS();FB();FA();VFO(); //J:エンコーダステップ周波数
//JJ:Jのカーソル位置
while(1){
FC();LCN();CC();EN();
FS();FB();FK();FABC1();
}
}
***********
此処までがメインプログラムで、此れより下は全て関数プログラム。
FS(){ } // 周波数スパン***
FC(){ } // 周波数カウンタ***
EN(){ } // エンコーダ***
FK(){ } // 発振周波数計算 P/Q***
LCN(){ } // 8桁の数字を表示***
LCC(){ } // カーソル操作***
CC(){ } // カーソル表示***
FABC1(){ } // P1,P2,P3の変化***
FABC2(){ } // Q1,Q2,Q3の変化***
VFO(){ } // VFO初期設定***
STA(){ } // スタート条件出力***
STP(){ } // ストップ条件出力***
OUT(data){ } // I2Cで1バイト出力/ACK***
FA(){ } // LCD初期化***
LD(data){ } // LCD 1文字表示データ出力***
VD(regi,data){ } // VFO 1データ出力***
LC(cmd){ } // LCD 1コマンド出力***
**********
ウンザリするほど長いです。
しかも 12F683のメモリを殆ど使い切っています。(98%以上)
ですから他の事をやらせたくても出来ません・・・悪しからず。
必ず居るんですね~・・・此れもアレモついでにやらせろと云う輩が・・・(独り言です)
肝心な性能の方は・・・
発振周波数範囲: 2.5~20MHz/1Hz~100kHzステップ
スプリアス(高調波を除く):-60~-70db
周波数精度:モジュールに付随している水晶発振子に聞いて下さい。
実験中に何個かの Si5351Aモジュールを壊してしまいました。
其の教訓を生かして?出力側に 2SK125のソースフロアを入れてます。配線図を下に・・・
私の独断と偏見によるプログラムが多数有りますので、パクル人は自己責任でお願いします。
以上、大変長い間 Si5351Aのプログラムにお付き合い頂き有難うございました。
これからも宜しくお願いします。 by JA1QVM