PIC16F683を使ってLEDをフラッシュ点灯させる
16F683マイコンを利用して、LEDをフラッシュさせてみましょう。このプログラムは、割り込み制御と出力方法の工夫が必要です。今回のサンプルプログラム以外にも同じ動作をさせることが可能なので、色々挑戦してみても面白いかもしれませんね。
今回の作業で必要なもの
下記に今回使用した部品と金額の一覧を記載します。秋月電子さんで購入した場合の金額を記載しておきました。今回の部品を揃えると、金額は「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の詳細
下記に記事を書いておきましたので、そちらをご覧ください。接続に必要なページは切り抜いておきました。データシートが必要な方は、まとめに記載しておきます。
→マイクロチップ社のページはここをクリック
16F683のデータシート
下記のリンク先から、画面を下にスクロールすると下図のような画面がでてきますので、「Download」をクリックします。
回路の作成
Eagleを使って今回の回路図を作成します。基本的な回路なので割と簡単に作成可能です。Eagleを使った図面の書き方については、後日記事にしたいと思います。
回路作成についてです。
ポイント1:PICマイコンは必ず「MCLR」があります。このピンは、リセット機能があるため、必ずプルアップでスイッチを入れるか信号
を常にHightにしなければなりません。今回は、常にHightにしました
ポイント2:電源とGNDには、0.1uのコンデンサを接続します。電圧変動やノイズ等の対策で保険的な要素で接続します。
ポイント3:「1」光る 「0」消去 LEDを光らせる方法をプログラムで制御したいと思うので、下図のような配線にしました。
MPLABを使ってプロジェクトを作成
プロジェクトの作成について記事を書いていますので、そちらを参考にしてください。
フラッシュのソースコード
今回は、LED2つを使ったフラッシュ点灯を再現します。下図のパターンで点灯させます。フラッシュなので、一瞬光って消灯を長くします。プログラムでは、下記の点灯です。一瞬光る点灯が再現出来ていると思います。
LED ON :30ms
LED OFF:2000ms
ソースコード
/*
* File: flash.c
* Author: TM-kit
*
* Created on 2022/01/09, 20:19
*/
#include <xc.h>
// 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;
int g_delayTime = 500;
#define _XTAL_FREQ 4000000
//スイッチを定義して今後SW1とする
#define SW1 GP5
#define Led_ON 1
#define Led_OFF 0
#define Led_ON_Time 3
#define Led_OFF_Time 200
static void interrupt time0int (void){
if(INTCONbits.T0IF == 1){
/*タイマーフラグをリセット*/
INTCONbits.T0IF = 0;
TMR0=252;/*10m秒ごと*/
g_cnt++;
if(g_cnt>g_delayTime){
g_flag++;
g_cnt=0;//タイマーカウントのリセット
}
//WRITETIMER0(64536);
}
}
void main(void) {
//変数設定
unsigned char led_data = 0;
/*手順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=0b00001000;
/*ポートのデータは何が入っているかわからないので、消灯できるように0をポートに入れておく*/
GPIO=0b00000100;
/*念のためにコンパレータを無効にしておく*/
CMCON0 = 0b00000111;
GP0=1;
TMR0 = 252;
INTCONbits.T0IE = 1;
INTCONbits.GIE = 1;
//プログラム開始前の初期設定
g_delayTime = 10;//割り込み時間設定 10ms
g_flag = 0;
//プログラムの動作開始
while(1){
if(g_flag < Led_ON_Time){
led_data = 0b00000110;//LED点灯
}
if(g_flag >=Led_ON_Time && g_flag < Led_OFF_Time){
led_data = 0b00000000;//LED点灯
}
if(g_flag >=Led_OFF_Time){
g_flag = 0;
}
//出力
GPIO = led_data;
}//プログラムここまで
return;
}
まとめ
今回のプログラムのポイントは、割り込みで利用した「g_flag++」です。この変数を加算させた値の幅でLEDのONとOFFの制御をしています。これ以外にも同じ動作をさせる方法があると思います。それを見つめけるのも面白いですよね