PICでCの練習 2007.05.04(金)〜 LessonC_10。 if文でスイッチ入力をテスト。スイッチを押すごとにオン・オフします。
著作者名: 中野 良知 作成開始: 2007.05.04(金) 更新 : 2007.05.04(金) : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. フローチャート 3. プログラムソースコード 4. キーワード 4.1. ビット反転 4.2 チャタリング 4.3 タイミングチャート 5. 実行結果 6. 実験回路 1. 目的 if文でスイッチ入力をテストし、LEDをON/OFFさせます。 2. フローチャート (main) ↓ ポートの初期化 ↓ ├←────────────────┐ │ no │ < スイッチオン? > →─────────┤ ↓yes │ ポートBのビット0と1の │ 排他的論理和を出力 │ │ │ ├←───────────┐ │ │ no │ │ < スイッチオフ? > ────→┤ │ ↓yes no │ │ < オフで10msec経過? > ──→┘ │ ↓yes │ └─────────────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_10 // 作者 : ioio // 目的 : if文でスイッチをテストし、オンする毎にLEDを点灯/消灯させます。 // マイコン : PIC16F84A // クロック : 20MHz // Config : PROTECT=OFF, WDTE=OFF, XTAL // Compiler : PICC Lite(V9.6)。 HI-TEC software製。 // Compile : >picl -16f84a lesson.c // ASM List : >picl -16f84a --ASMLIST lesson.c //***************************************************************************** // 変更履歴 // 2007.05.04(金) 作成 // 2007.05.14(月) configでXTALをHS_OSILLATORに変更 //***************************************************************************** #include "pic.h" // デバイス関連の定義を展開 void delay_msec(unsigned int); __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR void main(void) { int sw_chat; // スイッチのチャタリング処理用 TRISB = 0xFE; // PortB b0=Out. b1,b2,b3,b4,b5,b6,b7=In TRISA = 0x0F; // PortA b0,b1,b2,b3=In while(1){ if(RA0 == 0){ // スイッチオンなら // LED出力を排他的論理和でビット反転 RB0 ^= 1; // LED ON/OFF // スイッチのオフ確定待ち。チャタリング処理 sw_chat = 0; // チャタリング処理クリア while(1){ delay_msec(1); // 1msecの遅延 if(RA0 == 0){ // スイッチオンなら sw_chat = 0; // チャタリング処理クリア }else{ if(++sw_chat == 10){ // スイッチオフで10msec経過したら break; // while文を終了 } } } } } } //----------------------------------------------------------------------------- // タイトル : msec単位の遅延関数 // 作成 :2007.05.04(金) //----------------------------------------------------------------------------- #define D1MSEC 500 void delay_msec(unsigned int msec) { unsigned int cnt; while(msec--){ cnt = D1MSEC; while(cnt--); } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. ビット反転 RB0 ^= 1 RB0の現在の出力値と1との排他的論理和でビットを反転し出力します。 排他的論理和 真理値表 A B → A 0 0 0 1 0 1 0 1 1 ┐ 1 1 0 ┘この組合せを利用します。 例:A=0x9D, B=0xFF A 0b01011101 0x9D XOR B 0b11111111 0xFF ------------------------------ 0b10100010 0xA2 4.2 チャタリング スイッチを押したときのRA0の入力信号に、 ──────┐┌┐ ┌┐┌───────── RA0 └┘└─────────┘└┘ のようなオンとオフの瞬間にチャタリングが発生することがあります。 マイコンが高速に処理をするとLEDがチャタリングの影響を受けてしまいます。 ┌┐┌┐ ┌┐ LED──────┘└┘└────────┘└────────── スイッチがオフしても、RA0がHに安定するまでオフの判定を待つことでLEDの誤動作 を防止する事が出来ます。 ──────┐┌┐ ┌┐┌───────── RA0 └┘└─────────┘└┘ ──────┐ ┌────── 判定 └────────────────┘ ┌─────────────────────── LED──────┘ 4.3 タイミングチャート ───┐ スイッチオン ┌────┐ ┌─────┐ RA0 └───────┘ └────┘ └── ┌────────────┐ ┌── LED ───┘ LEDオン └──────────┘ 5. 実行結果 上がスイッチ入力波形。 下がLED出力波形。 6. 実験回路 PIC16F84A ┌────┐14 │ VDD├──────●──────●────●──── +5V │ │ │ │0.1u │ │ │ R10K ┴ /50V │┴│100u/16V │ │4 │ 0.1u/50V ┬ └┬┘ │ -MCLR├──────●─┤├───●────┘ │ │ │ │ │16 ┌ ─ ─ ─ ┐ │ │ OSC1├───●─┤├──┐ │ │ │ │┴ ││ │ │ │ □ 20MHz │ │ │ │15 │┬ ││ │ │ OSC2├───●─┤├──● │ │ │ └ ─ ─ ─│┘ │ │ │5 ┌───────┘ │ │ Vss├─●───────────● │ │ │ │ │ LED │ │ │6 ┌─┬┐K │ │ RB0├──┤ │├─R220──● │ │ └─┴┘ │ │ │ │ │ │ +5V │ │ │ │ │ │ │ R10K S1 │ │ │17 │ / │ │ RA0├──●───○ ○────● │ │ │ │ │ │ └────┘ ┴ GND 0.1u/50VのコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system