2023年1月3日火曜日

si5351a TFT 1.8”VFO Ver.1.3(8BAND)

si5351a 1.8"TFTを使ったマルチバンド(8バンド)VFOである。このVFOは、Ver1.2をマルチバンド化したもの。特徴は、PCF8574を拡張出力ポートとして使った。UNO/nanoで動作確認済み。総合的なレスポンスも良いので、上手くまとまったと思う。







回路図


 スケッチ

バンド設定は、周波数テーブルに8バンド定義した。DEF_Fは、デフォルト周波数。LOW_Fは、最低周波数。HI_Fは最大周波数である。8バンド以上に拡張する場合、PCF8574のさらなる追加とスケッチ追加、修正が必要。



 











IF周波数とBFOの周波数を変更する時は、ここを修正する。VFOは、upper heterodyneの動作で、直接スケッチに書いている。一般的なBFO周波数を示す。BFO_LSBは、IF+1500Hz。BFO_USBは、IF-1500Hz。BFO_CWは、IF+700Hz但し、トーン周波数を700Hzとした場合。

 









最大何バンドにするのかは、Max_Bandで指定する。例えばMax_Band 6にした場合、3.5Mhzから21MHzの6バンドになる。(先頭に書いて有る3.5MHzから数えて6バンドとなる)
EEPROMデータをクリアするには、Int_Endを49以外の数値に変更する。これは重要で、EEPROMクリアしなければ以前のデータが読み込まれて動作するので、意図しない動作をするかもしれない。EEPROMデータのデフォルト値読み込みは、STEPを押しながら電源onでも出来る。

スケッチ等のダウンロード

このVFOに必要なファイルは、ダウンロードサイトからダウンロード可能。

Download siteにあるsi5351a TFTフォルダのsi5351a_TFT18_1.3.zip


  

     

2022年12月23日金曜日

PCF8574 DIO拡張

Arduino UNO/nanoを使っていると、DIO点数が不足する事がある。DIO点数の多いMPUを使えば良いが、I2C接続のPCF8574を使えば簡単に拡張できる。拡張したDIOで、LEDのスイッチによるon/offスケッチを書いた。デバイスのアドレスは、表4の右側(R/Wなし7ビット16進アドレス)である。



回路図




デバイスアドレス

スケッチ

















ダウンロード

必要なファイルは、ダウンロードサイトにあるPCF8574フォルダのLEDswitch_on_off.zipダウンロード可能。


2022年12月21日水曜日

si5351a TFT VFO Ver.1.2

2017/6/3公開の1.8"TFT VFOエンコーダ操作時のレスポンスなどの問題もあり。見直した。当時、Arduino UNOで開発したが、機器に組み込むには大きすぎる。そこで、Arduino nano(UNOより使える容量が少ない)で動作出来る様、改造。
【改造点】
・エンコーダレスポンス改善
・Arduino nanoも動作
・他バンドへの改造が容易
・バグ修正

回路図     



       

      ライブラリの変更

si5351aコントロールの為、コンパクトなオリジナルライブラリを使っている。このライブラリで出力可能な周波数は、500kHz~150MHzである。しかし、AM BFOは0Hzを出力したいので工夫が必要。そこで、500kHz以下の周波数設定の時、出力offにした。






    





途中省略









以下省略

黄色マーカー部分が、si5351a2.hの追加変更箇所である。

他の周波数への変更方法

このVFOは前バージョン同様、モノバンド用である。


1)EEPROM初期化比較値’73’を他の数値に変更して、デフォルト値を初期値としてロードさせる。黄色のマーカ値を33,49,72など0以外の数値に変更する。







2)バンド変更とIF周波数及び、BFO周波数変更

周波数校正方法

スケッチを書き込んだのみでは、周波数が正しく出力されない。これは、何れのライブラリを使っても言える事で、校正をしなければ正しい周波数にならない。

【校正前】                【校正後】

校正手順
 1)si5351aのch2(BFO出力)に周波数カウンターを接続する。
 2)VFOをLSBモードにする。この時、IF_FREQがデフォルト値であれば、10.715MHz
  を出力している筈である。もし、10.715MHzいがいであれば3)の作業を繰り返す。
 3)si5351a2.hの黄色マーカ部の数値を変更して、コンパイル、書込み10.7150MHz
  になるまで繰り返す。

スケッチ等のダウンロード

このVFOは、500kHzから150MHzまで出力可能だが、表示は1Hz台から99MHz台までである。理由は、ヘテロダイン出力の見直し、表示域を増やすことによるレスポンス低下懸念がである。スケッチは99MHz台まで表示可能。追加機能として、EEPROM初期化をSTEP SWを押した状態で電源onすると、デフォルト値になる処理を含めた。

Download siteにあるsi5351a TFTフォルダのsi5351a_TFT18_1.2.zip







2022年4月8日金曜日

uSDX FST3253/CBT3253


FST3253またはCBT3253が使えるPCBを作った。特徴は、RF AMPを実装可能としたことである。RF AMPは、MMICでMSA0886用に設計したが、同様なデバイスで有れば実装できるであろう。もし、RF AMPが不要であれば、ジャンパーすればよい。また、FST3253は、変換基板を用いDIPで使っている。このDIP16変換基板は、SOP16/TSSOP16/SSOP16に対応している。変換基板の入手さきは、Aliexpressである。国内で販売されてる変換基板は、仕様が異なる為、使えない。
         



変換基板     

SOP16からDIP16に変換。入手先は、Aliexpress










LPFなしの写真

LPFを外した状態。中央下の赤色が、FST3253とCBT3253の切替ジャンパーpin。その横がMMIC実装スペースである。この写真は、RF AMPなし。
   
  











回路図



スケッチ     

Ver1.02wを使用。
回路図、Gerver file、スケッチを纏めてuSDX_CBT.zipにしてある。Download siteのuSDXフォルダからダウンロード可能。
        

     

2022年1月24日月曜日

uSDX PCB Version

HC4053を使ったuSDXのPCBを作った。操作面とIC,抵抗、コンデンサなどを付けた部品面の2面方式にした。最近、多バンド化傾向がみられるが、プラグイン多バンド方式とした。その為、ケーシングしたする場合、裏面にLPFが配置される。ユニバーサル基板で組んだ時からH/W、F/W変更は無いが、回路図に部品番号を追加した位である。






部品面のLPFの下にBS170が配置されている。LPFは、定型7ポールPCBを以前作ったので、流用した。電源を13.8V印可した時、デフォルトのパラメータで4W強の出力があった。








回路図      


ダウンロード    

スケッチ、回路図、uSDXガーバーデータ、LPFガーバーデータをダウンロードサイトのuSDXフォルダ からダウンロードできる。   

      






        

    


            

        

2021年12月31日金曜日

uSDX

uSDXをWeb検索してたら、FTS3253の替わりに74HC4053を使ったHF5L の記事がHitした。Arduino nano 16MHz(無改造)とsi5351module(改造)を使って簡素化した回路である。ユニバーサル基板で作れるとの事だったので、早速作ってみた。一部変更したが、殆ど回路図通り配線。WB2CBAのLPFは、AADE Filter Designでシュミレーションした。電源電圧13.8V(ダイオードの短絡保護回路を入れているので、13.2V位)で試験を行った。パラメータをデフォルト値で、7MHz時3.4W、28MHz時2.6W。また、オールモード動作確認もできた。








回路図


    




 


 

      




si5351モジュール改造

1.赤丸6か所の部品を外す。


   



      







 2.1k 2か所、0オーム(ジャンパー) 2か所 部品を付ける 。



WB2CBA LPFシュミレーション

7MHz時





 






C1=330pF、L2=0.1083uH T37-6 19t、C2+C3=470pF、C4=102、C5=330pF、C6=102、L3=0.363uH T37-6 11t


28MHz時

C1=68pF、L2=0.192uH T37-6 8t、C2+C3=180pF、C4=330pF、C5=100pF、C6=330pF、L3=0.075uH T37-6 5t


スケッチ

Version1.02wを変更修正

1.行12 #define CAT 1をコメントに変更。

  //#define CAT 1

2.行13 #define F_XTAL    27005000をコメントに変更。

  //#define F_XTAL    27005000

3.行15 //#define F_XTAL  25000000を//外して宣言文を有効にする。

  #define F_XTAL  25000000

4.行29 //#define F_MCU   16000000を//外して宣言文を有効にする。

  #define F_MCU   16000000

5. 行73 #define SIG_OUT 11 11を13に変更。

  #define SIG_OUT 13

6.行75 #define DIT     13 13を11に変更。

  #define DIT     11

修正済みのスケッチ、回路図などDownload siteからuSDX.zipをダウンロード可能。  





2021年8月1日日曜日

oled CB VFO

oled 50MHz AM VFOのCB版。VFO/チャンネルの2モード方式は、50MHz AM版と全く同じである。違いは、CBの場合、指定された周波数のみでの運用である。そのため、VFO周波数が指定された周波数であるか否かをチェックしなければならない。50MHzバンド外と同様に、送信時に--.---.--と表示される。EEPROMにデータ保存しているので、電源off後、直前の状態に復帰する。




操作

・EEPROM初期化

  STEP SWを押しながら、電源onして”ーー.---.--” が表示されるまでSTEP SWを押していると、EEPROMの初期化が行われる。

・VFOモード(上の写真は、チャンネルモード)

 STEP SWを長押しすると、VFOモードからチャンネルモード、または、チャンネルモードからVFOモードに変わる。

チャンネル書き換え

 チャンネルモードの時、RIT SWを長押しし、VFOモードを表示させ希望の周波数に変更する。再び、RIT SWを長押しするとチャンネルモードに表示が変わり、変更されたチャンネルデータで表示される。書き換え可能なチャンネルは、”0”、”9”のみである。チャンネル”1”から”8”は指定周波数なので書き換え不可。


回路図


   










スケッチ

コンパイルする時、必要に応じマーカ部分の変更をする。

・RX_IF = 455000 受信時のオフセット。初期値 455000(+455kHz)

・TX_IF = 0 送信時のオフセット。初期値 0

・Int_End = 49 プログラムからの初期化を行う時の、初期化終了判断コード。

残っている前回データをクリアして、新しい初期値をセットしたいときに使う。前回の判断コードと同じ場合は、初期化されないので注意。


必要なファイルは、JA2GQP Download siteのsi5351 VFOフォルダからダウンロード出来る。


//////////////////////////////////////////////////////////////////////

//  si5351a oled(128x32) VFO program ver.1.0

//    Copyright(C)2019.JA2GQP.All rights reserved.

//

//                                                2021/7/29

//                                                  JA2GQP

//--------------------------------------------------------------------

//  Function

//    1.VFO/Channel mode

//    2.STEP(10k,1k)

//    3.Automatic memory

//    4.Protection Operation At The Time Of Transmission

//    5.S-Meter

//////////////////////////////////////////////////////////////////////


#include "src/Rotary.h"               // http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html

#include "src/si5351.h"               // https://github.com/etherkit/Si5351Arduino, v2.1.0

#include "src/SSD1306AsciiAvrI2c.h"   // https://github.com/greiman/SSD1306Ascii

#include <EEPROM.h>



////////////////////////////////

// Set Device 

////////////////////////////////

Rotary r = Rotary(2, 3);              

Si5351 si5351(0x60);                  // Si5351 I2C address

SSD1306AsciiAvrI2c oled;


////////////////////////////////

// I/O Port

////////////////////////////////

const byte SW_RIT = A0;               // RIT SW

const byte SW_STEP = A1;              // STEP SW

const byte SW_TX = A2;                // TX/RX

const byte AD_SM = A7;                // S-meter AD


////////////////////////////////

// EEPROM Memory Address

////////////////////////////////

const byte  Eep_Init = 0x00;          // Eep Init(1byte*1)

const byte  Eep_Band = 0x01;          // Band(1byte*1)

const byte  Eep_Ch = 0x02;            // Channel(1byte*1)

const byte  Eep_Chan = 0x03;          // VFO-Channel Mode(1byte*1)

const byte  Eep_Freq = 0x10;          // Frequency(4byte*5)

const byte  Eep_Step = 0x30;          // STEP(4byte*5)

const long  Eep_Chfreq = 0x50;        // Channel(4byte*5)


////////////////////////////////

// frquency data

////////////////////////////////

const unsigned long FRQ_TBL[5] = {

 // DEF_F    CW_F      SSB_F     AM_F      HI_F

  26968000 ,26515000 ,26515000 ,26515000 ,27855000

  };


const unsigned long CH_TBL[] = {          // Initial frequency value

  27524000 ,26968000 ,26976000 ,27040000 ,27080000 ,

  27088000 ,27112000 ,27120000 ,27144000 ,27005000

  };

const byte  Max_Chan = sizeof(CH_TBL) / sizeof(CH_TBL[0]);  // Max Channel


//---- data offset -----

const byte DEF_F = 0;

const byte CW_F = 1;

const byte SSB_F = 2;

const byte AM_F = 3;

const byte HI_F  = 4; 

//---- IF offset -------

const unsigned long RX_IF = 455000  // RX_IF offset = +455kHz 

const unsigned long TX_IF = 0;        // TX_IF offset 


////////////////////////////////

// Encorder STEP

////////////////////////////////

const int STEP_50 = 50;               // STEP 50Hz

const int STEP_1k = 1000;             //      1k

const int STEP_10k = 10000;           //      10k


////////////////////////////////

// etc

////////////////////////////////

const byte  Int_End = 49;             // Initial end code

const char Call[9] = "JA2GQP";        // Display Call sign


////////////////////////////////

// Memory Assign

////////////////////////////////

unsigned long Vfo_Dat;                // VFO Data

unsigned long Ch_Dat;                 // Channel Data

int Rit_Dat;                          // RIT Data

unsigned long Enc_Step;               // STEP

char Enc_Dir = 0;                     // -1 DIR_CCW, 0 DIR_NONE, 1 DIR_CCW

byte Ch_Index = 0;                    // Channel TBL index

unsigned int Val_Smeter = 0;

unsigned int Val_Smeterb = 1;


long Time_Passd;                      // int to hold the arduino miilis since startup

long Time_Mode;                       // Mode change Time

byte Flg_eepWT = 0;                   // EEP Write Flag


byte Flg_Mode = 3;

byte Flg_Over = 0;

byte Flg_Vfo = 0; 

byte Flg_Tx = 0;

byte Flg_Chan = 0;                    // Channel Flag 0:VFO, 1:Cannel

byte Disp_Over = 1;

byte Disp_Freq = 1;

byte Disp_Tx = 0;

byte Disp_Rit = 0;

byte Flg_Rit = 0;                     // RIT Flag


//----------  setup  ----------------------------------------------------


void setup() {

  pinMode(SW_STEP, INPUT_PULLUP);

  pinMode(SW_TX, INPUT_PULLUP);          

  pinMode(SW_RIT, INPUT_PULLUP);          

  pinMode(12, OUTPUT);                // pin12,pin13

  pinMode(13, OUTPUT);                // 0,0=CW 1,0=LSB 0,1=USB 1,1=AM           


  attachInterrupt(0, rotary_encoder, CHANGE);

  attachInterrupt(1, rotary_encoder, CHANGE);


  si5351.init(SI5351_CRYSTAL_LOAD_8PF,0,0);    // crystal 25.000 MHz, correction 0

  si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_4MA);//Drive lebel 4mA set 

  oled.begin(&Adafruit128x32, 0x3C);


  if(EEPROM.read(Eep_Init) != Int_End){        // Eep initialaz

    delay(10);

    eep_init();

  }

  else{

    if(digitalRead(SW_STEP) == LOW){

      delay(10);

      eep_init();

      fover_disp();

      while (digitalRead(SW_STEP) == LOW);

    }

  }

  eep_rdata();

  mode_disp();

  step_disp();

}


//----------  main  ----------------------------------------------------


void loop() {

  if(Flg_Chan == 0){

    vfo_mode();

  }

  if(Flg_Chan == 1){

    ch_mode();

  }

}


//----------  Channel mode  ------------------------------------------------


void ch_mode(){


////////////////////////

// receive

////////////////////////

  if(digitalRead(SW_TX) == HIGH){           

    Flg_Tx = 0;

    si5351.output_enable(SI5351_CLK0, 1);   // VFO enable 


    if (Flg_Rit == 0){

      if(Disp_Freq == 1){

        if((Ch_Index == 0) && (Enc_Dir == -1))

          Ch_Index = Max_Chan-1;

        else if((Ch_Index == Max_Chan-1) && (Enc_Dir == 1))  

          Ch_Index = 0;

        else

          Ch_Index += Enc_Dir;


        Enc_Dir = 0;


        Ch_Dat = eep_read4(Eep_Chfreq+Ch_Index*4);  // Channel data read

        band_check(Ch_Dat);                         // range check

        si5351_set_freq(Ch_Dat + RX_IF);            // frequency out

        ch_disp(Ch_Dat);                            // Channel display

        Disp_Freq = 0;


        Flg_Vfo = 1;

        mode_disp();

        Rit_Dat = 0;


        Time_Passd = millis();

        Flg_eepWT = 1;

      }

    }      

    else{

      if (Disp_Rit == 1){

        Rit_Dat += Enc_Dir * Enc_Step;

        Enc_Dir = 0;

        Rit_Dat = constrain(Rit_Dat, -5000, 5000);

        si5351_set_freq(Ch_Dat + RX_IF + Rit_Dat);

        rit_disp(Rit_Dat);

        mode_disp();

        Disp_Rit = 0;

        Flg_Vfo = 1;

      }

    }   


////////////////////////

// STEP

////////////////////////

    if (digitalRead(SW_STEP) == LOW) {      // increment events

      Time_Mode = millis();        


      while (digitalRead(SW_STEP) == LOW){

        if(Time_Mode+1000 < millis()){

          if(Flg_Chan == 0){                  // VFO mode?

            Flg_Chan = 1;                     //  yes,Channel mode set

            break;

          }  

          else{                               //  no,VFO mode

            Flg_Chan = 0;                   

            freq_disp(Vfo_Dat);               //  frequency display

            si5351_set_freq(Vfo_Dat + RX_IF); //  fequency data output

            Flg_Rit = 0;                      //  RIT reset

            Disp_Freq = 0;

            break;

          }

        }

      }


      while (digitalRead(SW_STEP) == LOW);

      if(Flg_Chan == 1){

        enc_step();

        step_disp();

      }

    }


////////////////////////

// RIT

////////////////////////

    if (digitalRead(SW_RIT) == LOW) {

      Time_Mode = millis();

      while (digitalRead(SW_RIT) == LOW){


        if((Ch_Index == 0) || (Ch_Index == 9)){

          if(Time_Mode+1000 < millis()){

            if(Flg_Chan == 1){

              Flg_Chan = 0;

 

              Vfo_Dat = Ch_Dat;

              freq_disp(Vfo_Dat);

              si5351_set_freq(Vfo_Dat + RX_IF);

              Flg_Rit = 0;

              break;

            }

          }

        }

        

      }


      while (digitalRead(SW_RIT) == LOW);

      if(Flg_Chan == 1){

        rit_disp(Rit_Dat);

        Fnc_Rit(); 

      }

    }

    Disp_Tx = 1;

  }


////////////////////////

// send

////////////////////////

  else{                                     

    Flg_Tx = 1;

    Disp_Over = 1;


    if(Flg_Over == 0){                      // Within transmittable range?

        freq_disp(Ch_Dat);                  // frequency display

      si5351.output_enable(SI5351_CLK0, 1); // VFO enable

      if(Flg_Vfo == 1){

        si5351_set_freq(Ch_Dat + TX_IF);

        Flg_Vfo = 0;

      }

      Disp_Freq = 1;

      Disp_Rit = 1;

    }

    else{                                   // Out of range

      si5351.output_enable(SI5351_CLK0, 0); // VFO disable 

      if(Disp_Over == 1){

        fover_disp();                       // Display of over range

        Disp_Over = 0;

      }

    }

    if(Disp_Tx == 1){

      tx_disp();

      Disp_Tx = 0;        

    }

    Disp_Freq = 1;  

  }


////////////////////////

// common

////////////////////////

  Val_Smeter = analogRead(AD_SM);

  if ((abs(Val_Smeter - Val_Smeterb)) > 3){ // if needed draw S-meter

    sm_disp();

    Val_Smeterb = Val_Smeter;

  }


  if(Flg_eepWT == 1){                       // EEPROM auto Write

    if(Time_Passd+2000 < millis()){

      eep_wdata();

      Flg_eepWT = 0; 

    }

  }

}   


//----------  VFO mode  ------------------------------------------------


void vfo_mode(){


////////////////////////

// receive

////////////////////////

  if(digitalRead(SW_TX) == HIGH){           

    Flg_Tx = 0;

    si5351.output_enable(SI5351_CLK0, 1);   // VFO enable 


    if (Flg_Rit == 0){

      if(Disp_Freq == 1){

        Vfo_Dat += Enc_Dir * Enc_Step;

        Enc_Dir = 0;

        

        si5351_set_freq(Vfo_Dat + RX_IF);

        freq_disp(Vfo_Dat);                  // frequency display

        Disp_Freq = 0;


        Flg_Vfo = 1;

        mode_disp();

        Rit_Dat = 0;


        Time_Passd = millis();

        Flg_eepWT = 1;

      }

    }      

    else{

      if (Disp_Rit == 1){

        Rit_Dat += Enc_Dir * Enc_Step;

        Enc_Dir = 0;

        Rit_Dat = constrain(Rit_Dat, -5000, 5000);

        si5351_set_freq(Vfo_Dat + RX_IF + Rit_Dat);

        rit_disp(Rit_Dat);

        mode_disp();

        Disp_Rit = 0;

        Flg_Vfo = 1;

      }

    }   


////////////////////////

// STEP

////////////////////////

    if (digitalRead(SW_STEP) == LOW) {      // increment events

      Time_Mode = millis();


      while (digitalRead(SW_STEP) == LOW){

        if(Time_Mode+1000 < millis()){

          if(Flg_Chan == 0){

            Flg_Chan = 1;

            ch_disp(Ch_Dat);

            si5351_set_freq(Ch_Dat + RX_IF);

            eep_wdata();

            Flg_Rit = 0;

            break;

          }  

          else{

            Flg_Chan = 0;

            break;

          }

        }

      }

      

      while (digitalRead(SW_STEP) == LOW);

      if(Flg_Chan == 0){

        enc_step();

        step_disp();

      }

    }


////////////////////////

// RIT

////////////////////////

    if (digitalRead(SW_RIT) == LOW) {

      Time_Mode = millis();

      while (digitalRead(SW_RIT) == LOW){

        if(Time_Mode+1000 < millis()){

          if(Flg_Chan == 0){

              eep_write4(Vfo_Dat,Eep_Freq);

              Ch_Dat = Vfo_Dat;

              ch_disp(Ch_Dat);

              eep_write4(Ch_Dat,Eep_Chfreq+Ch_Index*4);

              si5351_set_freq(Ch_Dat + RX_IF);

              Flg_Rit = 0;

              Flg_Chan = 1;

              break;

          }

        }

      }


      while (digitalRead(SW_RIT) == LOW);

      if(Flg_Chan == 0){

        rit_disp(Rit_Dat);

        Fnc_Rit(); 

      }

    }

    Disp_Tx = 1;

  }


////////////////////////

// send

////////////////////////

  else{                                     

    Flg_Tx = 1;

    Disp_Over = 1;

    band_check(Vfo_Dat);                        // range check


    

    if(Flg_Over == 0){                      // Within transmittable range?

        freq_disp(Vfo_Dat);                 // frequency display

      si5351.output_enable(SI5351_CLK0, 1); // VFO enable

      if(Flg_Vfo == 1){

        si5351_set_freq(Vfo_Dat + TX_IF);

        Flg_Vfo = 0;

      }

      Disp_Freq = 1;

      Disp_Rit = 1;

    }

    else{                                   // Out of range

      si5351.output_enable(SI5351_CLK0, 0); // VFO disable 

      if(Disp_Over == 1){

        fover_disp();                       // Display of over range

        Disp_Over = 0;

      }

    }

    if(Disp_Tx == 1){

      tx_disp();

      Disp_Tx = 0;        

    }

    Disp_Freq = 1;  

  }


////////////////////////

// common

////////////////////////

  Val_Smeter = analogRead(AD_SM);

  if ((abs(Val_Smeter - Val_Smeterb)) > 3){ // if needed draw S-meter

    sm_disp();

    Val_Smeterb = Val_Smeter;

  }


  if(Flg_eepWT == 1){                       // EEPROM auto Write

    if(Time_Passd+2000 < millis()){

      eep_wdata();

      Flg_eepWT = 0; 

    }

  }

}   


//----------  Function Rit  --------------------------------------------


void Fnc_Rit(){

  if(Flg_Rit == 0){

    Rit_Dat = 0;

    Flg_Rit = 1;

  }

  else{

    Flg_Rit = 0;

    Disp_Freq = 1;

  }


//----------  RIT Display  ---------------------------------------------


void rit_disp(int rit_data) {

  unsigned int ri,rit;


  oled.setFont(lcdnums14x24);

  oled.setCursor(1, 0);

  oled.print("::::");


  if (rit_data < 0)

    oled.print('-');

  else

    oled.print('+');


  rit = abs(rit_data);

   ri = rit / 1000;  

  oled.print(ri);

  oled.print('.');

  ri = (rit % 1000) / 10;

  if (ri < 10)

    oled.print('0');

  oled.print(ri);

}


//----------  Write EEPROM 4byte  --------------------------------------


void eep_write4(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--;

  }

}


//----------  Read EEPROM 4byte  ---------------------------------------


long eep_read4(int address){

  long value = 0;


  for(int i = 0;i < 4;i++){

    value = value | EEPROM.read(address);

    if( i < 3){

      value = value << 8;

      address++;

    }

  }

  return value;

}


//----------  EEPROM Dat Read  -----------------------------------------


void eep_rdata(){

  Vfo_Dat = eep_read4(Eep_Freq);

  Enc_Step = eep_read4(Eep_Step);

  Ch_Index = EEPROM.read(Eep_Ch);

  Flg_Chan = EEPROM.read(Eep_Chan);

  Ch_Dat = eep_read4(Eep_Chfreq+Ch_Index*4);

}


//----------  EEPROM Dat Write  ----------------------------------------


void eep_wdata(){

  eep_write4(Vfo_Dat,Eep_Freq);

  eep_write4(Enc_Step,Eep_Step);

  EEPROM.write(Eep_Ch,Ch_Index);            // Ch_Index set  

  EEPROM.write(Eep_Chan,Flg_Chan);          // VFO-Channel 0:VFO 1:Channel  

  eep_write4(Ch_Dat,Eep_Chfreq+Ch_Index*4);

}  

    

//----------  EEPROM Initialization ------------------------------------


void eep_init(){

  int i;


  for (i=0;i<128;i++)                       // 0 clear(128byte)

    EEPROM.write(i, 0);


  eep_write4(FRQ_TBL[DEF_F],Eep_Freq);

  eep_write4(STEP_1k,Eep_Step);            // Step(1kHz)

  EEPROM.write(Eep_Ch,Ch_Index);           // Ch_Index set  

  EEPROM.write(Eep_Chan,Flg_Chan);         // Ch_Index set  


  for(i=0;i<Max_Chan;i++)

    eep_write4(CH_TBL[i],Eep_Chfreq+i*4);  


  EEPROM.write(Eep_Init,Int_End);           // Init end set(73)  

}


//----------  Rotaly Encorder  -----------------------------------------


void rotary_encoder() {                     // rotary encoder events

  uint8_t result = r.process();


  if(Flg_Tx == 0){

    if (result) {

      Disp_Freq = 1;

      Disp_Rit = 1;

      if (result == DIR_CW)

        Enc_Dir = 1;

      else

        Enc_Dir = -1;

    }

  }

}


//----------  si5351 PLL Output  ---------------------------------------


void si5351_set_freq(uint32_t frequency) {

  si5351.set_freq(frequency * SI5351_FREQ_MULT, SI5351_CLK0);

}


//----------  Encorede STEP  -------------------------------------------


void enc_step() {

  if(Enc_Step == STEP_1k)

    Enc_Step = STEP_10k;                    // 10k

  else    

    Enc_Step = STEP_1k;                     // 1k

}


//----------  STEP Display  --------------------------------------------


void step_disp() {

  oled.setCursor(109, 3);

  oled.setFont(labels);

  if (Enc_Step == STEP_50)

    oled.print("6");                        // 50Hz

  else if(Enc_Step == STEP_1k)

    oled.print("8");                        // 1k

  else

    oled.print("9");                        // 10k

}


//---------- Frequency renge over --------------------------------------


void fover_disp() {

  oled.setFont(lcdnums14x24);

  oled.setCursor(1, 0);

  oled.print("--.---.--");

}


//---------- callsign display ------------------------------------------


void call_disp() {

  oled.setFont(Arial_bold_14);

  oled.setCursor(56, 6);

  oled.print(Call);

}


//----------  Frequency Display  ---------------------------------------


void freq_disp(uint32_t sf_rx) {

  uint16_t fr;


  oled.setFont(lcdnums14x24);

  oled.setCursor(1, 0);

  fr = sf_rx / 1000000;

  if (fr < 10)

    oled.print(':');                        // ':' is changed to ' ' in lcdnums14x24.h

  oled.print(fr);

  oled.print('.');

  fr = (sf_rx % 1000000) / 1000;

  if (fr < 100)

    oled.print('0');

  if (fr < 10)

    oled.print('0');

  oled.print(fr);

  oled.print('.');

  fr = (sf_rx % 1000) / 10;

  if (fr < 10)

    oled.print('0');

  oled.print(fr);

}


//----------  Channel Display  -----------------------------------------


void ch_disp(uint32_t sf_rx) {

  uint16_t fr;


  oled.setFont(lcdnums14x24);

  oled.setCursor(1, 0);

  oled.print(Ch_Index);


  oled.print("::");                        // ':' is changed to ' ' in lcdnums14x24.h


  fr = sf_rx / 1000000;

  if (fr < 10)                            

    oled.print(':');                      // ':' is changed to ' ' in lcdnums14x24.h

  oled.print(fr);


  oled.print('.');

  fr = (sf_rx % 1000000) / 1000;

  if (fr < 100)

    oled.print('0');

  if (fr < 10)

    oled.print('0');

  oled.print(fr);


}


//---------- TX display ------------------------------------------------


void tx_disp() {

  oled.setCursor(2, 3);

  oled.setFont(labels);

  oled.print("1");                          // "1" is "TX" in labels.h

}


//---------- Mode display ----------------------------------------------


void mode_disp() {

  oled.setCursor(2, 3);

  oled.setFont(labels);

  if (Flg_Mode == 0){

    oled.print("2");                        // "2" is "CW" in labels.h

//    oled.print("/");                        // "/" is "AM" in labels.h

    digitalWrite(12,LOW);

    digitalWrite(13,LOW);

  }

  else if(Flg_Mode == 1){

    oled.print("3");                        // "3" is "LSB"

    digitalWrite(12,HIGH);

    digitalWrite(13,LOW);

  }

  else if(Flg_Mode == 2){

    oled.print("4");                        // "4" is "USB"

    digitalWrite(12,LOW);

    digitalWrite(13,HIGH);

  }

  else if(Flg_Mode == 3){

    oled.print("/");                        // "/" is "AM"

    digitalWrite(12,HIGH);

    digitalWrite(13,HIGH);

  }

}


//----------  S-Meter Display  -----------------------------------------


void sm_disp() {

  uint8_t a = 0;

  uint8_t m = 0;


  a = (Val_Smeter + 3) / 113;  // 1024 / 9 characters for S = 1,3,5,7,8,9,+10,+20,+30

  oled.setFont(pixels);

  oled.setCursor(25, 3);

  for (m = 0; m < a; m++)

    if (m < 6)

      oled.print('7');                      // '5' - hollow rectangle, 6px

    else

      oled.print('8');                      // '6' - filled rectangle, 6px

  for (m = a; m < 9; m++)

    oled.print('.');                        // '.' 1px

}


//----------  band chek  -----------------------------------------------


void band_check(unsigned long freq){

  Flg_Over = 1;

  for(int i=1;i<9;i++){

    if(freq == CH_TBL[i]){

      Flg_Over = 0;

      break;

    }

  }

  Flg_Mode = 3;

}