PIC12F683マイコンを使って踏切信号機の点灯を再現

今回の作業で必要なもの
下記に今回使用した部品と金額の一覧を記載します。秋月電子さんで購入した場合の金額を記載しておきました。今回の部品を揃えると、金額は「1035円」かかります。使いまわせる部品も多くあるので、初めに揃えれば購入する必要はありません。
| PIC12F683 | 1個 | 170円(I-00801) | 
|---|---|---|
| ブレッドボード | 1個 | 200円(P-05294) | 
| LED | 2個 | 200円(I-03982)※チップLEDです。 | 
| コンデンサ0.1u | 1個 | 15円(P-10147) | 
| 抵抗10k | 1個 | 100円(R-25103)※100個入り | 
| ジャンパワイヤ | 10本 | 350円(P-02932)※10本入り | 
PIC12F683の詳細
下記に記事を書いておきましたので、そちらをご覧ください。接続に必要なページは切り抜いておきました。データシートが必要な方は、まとめに記載しておきます。


回路の作成
 Eagleを使って今回の回路図を作成します。基本的な回路なので割と簡単に作成可能です。Eagleを使った図面の書き方については、後日記事にしたいと思います。
 回路作成についてです。
ポイント1:PICマイコンは必ず「MCLR」があります。このピンは、リセット機能があるため、必ずプルアップでスイッチを入れるか信号  
      を常にHightにしなければなりません。今回は、常にHightにしました
ポイント2:電源とGNDには、0.1uのコンデンサを接続します。電圧変動やノイズ等の対策で保険的な要素で接続します。
ポイント3:「1」光る 「0」消去 LEDを光らせる方法をプログラムで制御したいと思うので、下図のような配線にしました。

MPLABを使ってプロジェクトを作成
プロジェクトの作成について記事を書いていますので、そちらを参考にしてください。

踏切信号機のソースコード
/*
 * File:   newmain.c
 * Author: TM-kit
 *
 * Created on 2021/12/04, 22:51
 */
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
unsigned int g_cnt=0;
unsigned char g_flag=0;
#define _XTAL_FREQ 4000000
//スイッチを定義して今後SW1とする
#define SW1 GP5
#define Led_ON 1
#define Led_OFF 0
//タイマー0 割り込み
static void interrupt time0int (void){
    if(INTCONbits.T0IF == 1){
        /*タイマーフラグをリセット*/
        INTCONbits.T0IF = 0;
        TMR0=252;/*1m秒ごと*/
        g_cnt++;
        if(g_cnt>500){
            g_flag = ~g_flag;
            //GP0 = ~GP0;
            //GP2 = ~GP2; 
            g_cnt=0;
        }       
 //       WRITETIMER0(64536);
    }
    
}
void main(void) {
    /*手順1:内部クロックの設定:4MHz*/
    /*データシート:P19,P20*/
    OSCCON=0b01101000;
    /*ポートプルアップを使いたい場合は、このオプションレジスタを0で有効にしておく*/
    /*プリスケーラ:256 */
    OPTION_REG=0b00000111;
    /*手順2:ポートデジタルに設定*/
    /*P33(P35)*/
    /*設定全てデジタル & Fosc/64*/
    ANSEL=0b01100000;
    /*手順2:ポートの入出力の設定 1;入力 0:出力*/
    /*今回の設定:GP3は入力のみなので1を立てておく。また、今回は、反省を活かし入力をGP5とします*/
    /*データシート:P36*/    
    TRISIO=0b00101000;
    /*今回の入力は、GP5なのでそこをプルアップする*/
    WPUbits.WPU5=1;
    /*ポートのデータは何が入っているかわからないので、消灯できるように0をポートに入れておく*/
    GPIO=0b00000100;
    /*念のためにコンパレータを無効にしておく*/
    CMCON0 = 0b00000111;
    GP0=1;
    TMR0 = 252;
    INTCONbits.T0IE = 1;
    INTCONbits.GIE = 1;
    while(1){
        if(g_flag == 0){
            GP1 = Led_ON;
            GP2 = Led_OFF;
        }else{
            GP1 = Led_OFF;
            GP2 = Led_ON;
        }
    }
    return;
}まとめ
 今回は、割り込みを利用した待機時間を確保して作成しています。通常は、__delay活用して作成する場合が多いです。しかし、応用が利くプログラムかというとそうではありません。delayの動作は、プログラムを停止してしまうため、複雑なプログラムを構築するさいに動作不良の原因になる可能性があるためです。よって、今からそういったソースコードを書かずに、基本に忠実に書く癖をつけたほうが良いですね。
 (プログラム動作の基本)入力 → 処理 → 出力
 動作は、しっかりと2つのLEDが点滅を繰り返していると思います。
 Pickitを活用したプログラムの書き込みについては、後日記載します。
PIC12F683のデータシート
下記のリンク先から、画面を下にスクロールすると下図のような画面がでてきますので、「Download」をクリックします。

 

