スイッチの入/切でLEDを点灯させます

〔PICの動かせ方入門に戻る〕


タクトスイッチとLEDを配線しスイッチが押されたらLEDを点灯させます。

SWtoLED1

今回使用するピン番号は14番(VDD)と5番(VSS)と10番(RB4)と9番(RB3)です。
9番ピンがデジタル入力で10番ピンがデジタル出力です。

@まずは、下記図画面の様に配線しましょう。
 PICの14番ピンに電源+5V、5番ピンに電源GND(-)側、10番ピンにLEDの足が長い方を接続します。
 また、9番ピンにタクトスイッチを接続しますがプルアップ抵抗はPIC内蔵を使用します。
SWtoLED2 SWtoLED3

AMPLAB IDEを起動させます。

B下記がプログラムソースです、
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
 プログラムソースをダウンロードしてプロジェクトに取込む事も出来ます。
---------------------------------------------------------------------
#include <pic.h>

// 低電圧プログラミング機能使用しない(LVPDIS)
// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し(WDTDIS):内部クロックを使用する(INTIO)
__CONFIG(LVPDIS & UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;

void main()
{
     OPTION = 0b00000000 ;     // RB0-RB7のピン全てに内部プルアップ抵抗を使用する
     PCON   = 0b00001000 ;     // 内部クロックは4MHzとする
     CMCON  = 0b00000111 ;     // コンパレータは使用しない(RA0-RA4はデジタルピンで使用)
     VRCON  = 0b00000000 ;     // RA2はデジタルピンで使用する
     TRISA  = 0b00000000 ;     // 1で入力 0で出力 RA0-RA7全て出力に設定(RA5は入力専用)
     TRISB  = 0b00001000 ;     // RB3のみ入力、残り全て出力

     while(1) {
          if (RB3 == 0) {      // 9番ピンのスイッチが押されたか?
               RB4 = 1 ;       // 10番ピンにHIGHを出力する(LED 点灯)
          } else {
               RB4 = 0 ;       // 10番ピンにLOWを出力する(LED 消灯)
          }
     }
}
---------------------------------------------------------------------
CコンパイルPIC書き込みを実行して下さい。

DPICをブレッドボードに取付けて、スイッチを押してみて下さいLEDが点灯すると思います。

《やさしく解説》

タクトスイッチについて

SWtoLED5

 タクトスイッチは4本のリード線が出ていますが、
 写真の様に足が出ている側面の方向同し(3と4)がボタンを押した時につながります。

 押していない状態では(1と3)(2と4)同しがつながっています。
 (1と2)または(3と4)はつながっていない。

 押したら早い話全て(1,2,3,4)つながります。
 ですが通常は、(1と2)か(3と4)に配線します。

LEDについて

SWtoLED4

LEDには極性が有ります、
足の長いアノード側を10番ピンの方に、足の短いカソード側を電流制限抵抗の方に接続します。
また、LEDには流せる電圧と電流が決まっています、必ず電流制限抵抗を付けましょう。

電流制限抵抗
 LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあると思います、
 例えばIFが10mAで、VFが2.5Vで、picのデジタル出力が5Vとすると、
 (pic出力−順方向電圧)÷ 順方向電流 = 電流制限抵抗値
 よって、(5V - 2.5V) ÷ 0.010A = 250Ω(250Ωは無いので240Ωか270Ωを使います)
 10mAは0.010AというふうにAに変換して計算します。

 だいたい120Ω〜680Ωのあたりだと思います。
 LEDは5mAくらいで使った方が目に優しいでしょう、で470Ω?
 また、抵抗はLEDのアノード側とカソード側のどちら側に接続してもOKです。

 注意) PICの出力は20mA程しか流せません、これ以上のLED電流を流す場合は
     PICの出力をトランジスタで一旦受けてからLEDをつながないといけません。
     マイコン出力をトランジスタで一旦受ける場合はこちらを参考にして下さい。

プログラムについて

プログラムソースのコメントを読んでもらえば大体何をしているのか分かると思います。

while(1)
 main()の中の処理は1回実行すると終了します、
 だからwhile(1)の、{ }の中に処理を書き込めば無限に繰り返します。
 もしwhile(1)を記述しないとプログラムはすぐ終了し、スイッチを押してもLEDは点灯しません。

PIC内蔵プルアップ抵抗
 RB0〜RB7に接続すれば内蔵プルアップが使用できます。
 使用する場合は、下記のレジスターにて設定する必要があります。
 OPTION = 0b00000000 ; 赤い所とするとプルアップを使用しないです。
 デフォルトは内蔵プルアップは使用しないです、使用するでRB0-RB7が全てプルアップされます。
 また、RA0-RA7を使用する場合は外付け抵抗によるプルアップかプルダウンが必要です。

デジタルI/O
 デジタルピンの設定は下記のレジスターにて設定します。
 CMCON = 0b00000111 ; // コンパレータは使用しない(RA0-RA4はデジタルピンで使用)
 VRCON = 0b00000000 ; // RA2はデジタルピンで使用すると設定
 この設定にてRA0(17ピン),RA1(18),RA2(1),RA3(2),RA4(3)をデジタルにて使用可能。
 ちなみにこのPIC16F628Aはアナログ入力は出来ません。

ポートA
 TRISA = 0b00000000 ; RA0-RA7ピンの入出力を設定、1で入力 0で出力
               (右からRA0で、赤数字RA5は入力専用です設定は無意味)
ポートB
 TRISB = 0b00001000 ; RB0-RB7ピンの入出力を設定、1で入力 0で出力
               (右からRB0で、赤数字はRB3を入力にするです)

 ※プルアップを使用する場合はもちろんデジタル入力の場合だけです。

《その他》

今回は9番・10番ピンを使用しましたが他のピンを使用する場合は下記の表を参照して下さい。
また、4番ピンRA5は入力しか出来ません、出力不可です。
ポートA
ピン番号 16 15 18 17
デジタル入出力ビット名 RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

ポートB
ピン番号 13 12 11 10
デジタル入出力ビット名 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.