ひと眠りして、目がさえたので、先のアンテナコントロール回路の実験がうまくいったのでそのゲート回路について防備録兼ねてのブログ投稿です。
3バンドのバーチカルアンテナの回路を4バンドにすべく検討しました。理由は単純に1.9Mz(1.8MHz)も追加したい為です。今までの、3.5MHz,3.8MHz,7MHzの切り替えの回路をそのまま使いたい思いがあったのですが、物理的に使用したPICのPIC12F675(8P)では3入力4出力を要するのでポート1つが足りない勘定です。そこを何とか同じPICでやろうという訳です。先に検討したPICでの実際のリレーコントロール出力をみると以下の3通りです。
7MHz 、3.8MHz、 3.5MHzの順(1は出力ON 0はOFF)
100
010
001
ここにない状態を1つ付けたしたいのですが、一番簡単なのが、次の
000
です。
出力がない状態を1.9MHzとするように3入力のSWをプログラムします。
なぜ、000にしたかというと、ゲートにてPICで出力できない(ポートが足りない)分をハードでカバーするためです。単純に000と3出力が出たときに出力するゲート回路を組めばいいのです。しかも、000 3出力を入力として出力1を出すだけです。そのまま単純に真理値表からNORゲートが当てはまります。私の場合は、手持ちゲートICの都合から実際に組むにはNORをNAND回路に変換して、汎用ゲートICで構成です。
イメージ 1

前のPIC&コントロール回路を変更します。
イメージ 2
3芯ケーブルは必然に、4芯ケーブルに変更になります。ゲート回路とSWトランジスタ回路の追加です。また、入力のGP3は内部プルアップがないので、外付けでプルアップが必要です。他は、プログラム設定でプルアップ設定できます。(GP4,GP5)

アンテナの切り替えリレー部も変更します。各バンド毎の設定に換えました。実際に調整が楽だったためです。
イメージ 3


実際のゲート実験回路です。実験というより、単純に配線しただけですが。。。
イメージ 4

前作成の回路とドッキングです。
イメージ 5
SW3の入力 3番PIN(GP3ポート)追加と1.9MHzのLED出力追加です。

以下、PIC12F675の3入力にての4バンドコントロールプログラムです。7MHzにSWで選択されているときは、SW2,SW3は押しても出力は7MHzから変わらないようにプログラムしてます。SW2,SW3の同時押しでも同じです。なお、電源が入った状態では、バーチカルアンテナの7MHzのデフォルト設定です。

int main(int argc, char** argv) {
    OPTION_REG = 0b00000010;//prescale 8 デジタルI/Oに内部プルアップ抵抗を使用する
    CMCON      = 0x07;       //コンパレータは使用しない
    ANSEL      = 0b00000000; //アナログは使用しない(全てデジタルI/Oに割り当てる)
   //TRISIO     = 0b00110000; //GP4,GP5だけ入力その他のピンは出力に割り当てる(GP3は入力のみ)
 
    TRISIO     = 0b00111000; //GP5,GP4,GP3だけ入力その他のピンは出力に割り当てる(GP3は入力のみ)
   //WPU        = 0b00110000; // GP4,GP5 PULLUP
 
    WPU        = 0b00110000; // GP5,GP4,GP3 MANUAL PULLUP
    GPIO       = 0b00000000;  //出力ピンの初期化(全てLOWにする)
    while(1)
    {
        if ((GPIO5 == 1) && (GPIO4 == 1 ) && (GPIO3 ==1)){ 
            Delay_ms(10);
            GPIO2 = 0;     
            GPIO1 = 0;
            GPIO0 = 1;     //7MHz Nominal
        }else{
            if((GPIO5 == 1 ) && (GPIO4 == 1) && (GPIO3 == 0)){
                Delay_ms(10);
                GPIO2 = 0;
                GPIO1 = 0;
                GPIO0 = 1;
            }else{
                if ((GPIO5 == 1) && (GPIO4 == 0 ) && (GPIO3 == 1)){  
                    Delay_ms(10);
                    GPIO2 = 0;     
                    GPIO1 = 0;      // 3.5MHz
                    GPIO0 = 1;
                }else{
                    if ((GPIO5 == 1) && (GPIO4 == 0) && (GPIO3 == 0)){
                        Delay_ms(10);
                        GPIO2 = 0;
                        GPIO1 = 0;
                        GPIO0 = 1; //7MHz
                    }else{
                        if ((GPIO5 == 0) && (GPIO4 == 1 ) && (GPIO3 == 0)){ 
                            Delay_ms(10);
                            GPIO2 = 0;     //1.9MHz
                            GPIO1 = 0;     
                            GPIO0 = 0;
                        }else{
                                if ((GPIO5 == 0) && (GPIO4 == 0 ) && (GPIO3 == 0)){ 
                                    Delay_ms(10);
                                    GPIO2 = 0;   //1.9MHz
                                    GPIO1 = 0;
                                    GPIO0 = 0;  
                                }else{
                                    if ((GPIO5 == 0) && (GPIO4 == 0) && (GPIO3 == 1)){
                                        Delay_ms(10);
                                        GPIO2 = 1;  //3.8MHz
                                        GPIO1 = 0;
                                        GPIO0 = 0; 
                                    }else{
                                        if((GPIO5 == 0) && (GPIO4 == 1) && (GPIO3 == 1)){
                                            Delay_ms(10);
                                            GPIO2 = 0;
                                            GPIO1 = 1;  //3.5MHz
                                            GPIO0 = 0;
                                        }else{
                                            GPIO2 = 0;
                                            GPIO1 = 0;
                                            GPIO0 = 0;
                                            Delay_ms(10);
                                        }
                                    }
                                }
                            }  
                    }
                }
            }
        }
    }
}
// 1mS x ms ウェイトルーチン
static void Delay_ms(unsigned char ms){
    unsigned char c;
    for (c=ms; c>0 ;c--){
        Delay_1ms();
    }
}
// 1ms ウエィトルーチン
static void Delay_1ms(){
    unsigned int cnt;
    unsigned int i;
    cnt = 76;
    for (i=0; i<cnt ; i++){
        NOP();
    }
}

余談ですが、4バンド用で、SW3を外せば(使わなければ)、前の3バンドの切り替えそのまま使用できます。今回はオプション的な追加でもあります。

つづく?