SSブログ

PIC12F683 DIP SW可変パルス・ジェネレーター(PG) [パソコン・インターネット]

新しい装置の開発が終わると次に考えなければならないのは
修理、校正等で返ってきた時の事です、迅速に診断するため

には治具が必須です、今回は診断に必要なパルス・ジェネレ
ーターを造りました、とても簡単な回路です、PIC12F683
これ一個と僅かな周辺部品で実現出来ます。
現物はこれです↓
DSCN0662_R.JPG

パルスの周波数はロータリーDIP SW
を使い15種類の
パルスが出せます、精調時には高精度のパルス・ジェネレーター
が使える様に外部入力と内部と切替えられるようにしました。

回路は下記の通り。↓
bandicam 2021-01-24 17-13-06-889.jpg

PICKIT3でプログラムの書き換えは可能ですがオンボードで
実行する場合は
ロータリーDIP SW を F に設定しなければなりません
何と成れば使用
ロータリーDIP SW はノーマリー・クローズなのです
従って F  にすればDIP SW は回路から切り離されPICKIT3の信号線は
恰もDIP SWが無いかの様にプログラミングの邪魔をしなくなります。
まぁ、CPUをIC SOCKETから抜き取って別途プログラミングすれば善い
のですけどね。

プログラムは以下の通りです、周波数はそれぞれの時間を設定すれば
良い訳でON/OFFの合計がワン・サイクルですから直感的で判りやすい
ですね、ただ、精度を出すにはカウンター等で測定し精調しなければな
りません。

/*
 * File:   2400m_jigosc_v101.c
 * Author: maru
 * Pluse Generator by DIP-SW
 * Created on 2021/01/24, 9:38
 * 参考ホームページ↓
 * https://sites.google.com/site/tmkit8/12f683/lian-xi4-pic12f683
 * https://monozukuri-c.com/langc-bitoperation/
 */


#include <xc.h>

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF

#define _XTAL_FREQ 4000000
/*DipSW*/
//DipSW1 SW1 GP0 7pin
//DipSW2 SW2 GP1 6pin
//DipSW4 SW3 GP2 5pin
//DipSW8 SW4 GP3 4pin



int main(void)
{
    OSCCON=0b01101000;
    ANSEL=0b01100000;/*設定全てデジタル & Fosc/64*/
    TRISIO=0b00011111;
    OPTION_REGbits.nGPPU=0;/*ポートプルアップを使いたい場合は、このオプションレジスタを0で有効にしておく*/
    WPU=0x17;//2pin以外全部内臓プルアップだがGP3(4pin)は仕様で外部抵抗が必要//
     /*↓↓念のためにコンパレータを無効にしておく*/
    CMCON0 = 0b00000111;//これをヤラないとGP2 GP4 しかプルアップ出来ない
    int mask = 0x0F;//GPIOの下位4bit(GP3,2,1,0 DipSW入力)を抽出する
    
    while(1)
    {
        //DIP SW=1---------------
        if((GPIO & mask)==0x01)
        //if(GP0==1&&GP1==0&&GP2==0&&GP3==0)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(1500);
        }
        else{}
        //DIP SW=2---------------
        if((GPIO & mask)==0x02)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(1400);
        }
        else{}
        //DIP SW=3---------------
        if((GPIO & mask)==0x03)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(1300);
        }
        else{}
        //DIP SW=4---------------
        if((GPIO & mask)==0x04)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(1200);
        }
        else{}
        //DIP SW=5---------------
        if((GPIO & mask)==0x05)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(1100);
        }
        else{}
        //DIP SW=6---------------
        if((GPIO & mask)==0x06)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(1000);
        }
        else{}
        //DIP SW=7---------------
        if((GPIO & mask)==0x07)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(900);
        }
        else{}
        //DIP SW=8---------------
        if((GPIO & mask)==0x08)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(800);
        }
        else{}
        //DIP SW=9---------------
        if((GPIO & mask)==0x09)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(700);
        }
        else{}
        //DIP SW=A---------------
        if((GPIO & mask)==0x0A)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(600);
        }
        else{}
        //DIP SW=B---------------
        if((GPIO & mask)==0x0B)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(500);
        }
        else{}
        //DIP SW=C---------------
        if((GPIO & mask)==0x0C)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(400);
        }
        else{}
        //DIP SW=D---------------
        if((GPIO & mask)==0x0D)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(300);
        }
        else{}
        //DIP SW=E---------------
        if((GPIO & mask)==0x0E)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(200);
        }
        else{}
        //DIP SW=F---------------
        if((GPIO & mask)==0x0F)
        {
        GP5 = 1;
        __delay_ms(50);
        GP5 = 0;
        __delay_ms(100);
        }
        else{}

    }

    return(0);
}

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。