PICでCの練習 2007.05.07(月)〜 LessonC_14。 タイマー0割り込みで、0.5秒毎にLEDを点滅させます。
著作者名: 中野 良知 作成開始: 2007.05.07(月) 更新 : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. OPTION 4.2. 割り込み関数 5. 実行結果 6. 実験回路 1. 目的 1msecごとのタイマー0割込みで500msecの経過チェックを行いLEDを点滅させます。 2. ゼネラルフローチャート (main) ↓ ポートの初期化 ↓ タイマー割り込み許可 ↓ タイマープリスケーラー設定(1:32) ↓ タイマー設定 ↓ ├←┐ ↓ │ └─┘ (タイマー割り込み) ↓ タイマー設定 ↓ タイマー割り込み要因リセット ↓ 割り込みカウンタインクリメント ↓ no < 500ms経過? >→───(終了) ↓yes RB0ビット出力反転 ↓ 割り込みカウンタクリア ↓ (終了) 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_14 // 作者 : ioio // 目的 : タイマー0の割り込みで、0.5秒毎に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.07(月) 作成 // 2007.05.14(月) configでXTALをHS_OSILLATORに変更 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR //----------------------------------------------------------------------------- // 関数定義 //----------------------------------------------------------------------------- // 定数の定義 #define SET_TMR0 256-156 // 156*32*200ns=998.4us //----------------------------------------------------------------------------- // グローバル変数 unsigned int tcnt; // TMR0割り込みカウンター //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { TRISB = 0x00; // PortB b0,b1,b2,b3,b4,b5,b6,b7=Out INTCON = 0b10100000; // 割り込み制御初期化設定 OPTION = 0b11000100; // プリスケール=1/32 TMR0 = SET_TMR0; // タイマー0設定 PORTB = 0x00; // ポートB初期化 tcnt = 0; // TMR0割り込みカウンター初期化 while(1); // main()からの逸脱を防止 } //----------------------------------------------------------------------------- // タイトル :1msecのタイマー割り込み関数 // 作成 :2007.05.07(月) //----------------------------------------------------------------------------- static void interrupt isr(void) { TMR0 = SET_TMR0; // タイマー0設定 T0IF = 0; // タイマー0オーバーフローフラグリセット if(++tcnt == 500){ // 1msec割り込みが500回目なら RB0 ^= 1; // RB0ビット反転。排他的論理和 tcnt = 0; // TMR0割り込みカウンタークリア } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. INTCON 割り込み制御レジスターです。 全割り込み許可、TMR0割り込み許可、TMR0割り込み要求フラグを初期化します。 │ │ │ ↓ ↓ ↓ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ GIE │ EEIE │ T0IE │ INTE │ RBIE │ T0IF │ INTF │ RBIF │ └───┴───┴───┴───┴───┴───┴───┴───┘ 1 0 1 0 0 0 0 0 GIE =1 :全割り込みを許可 T0IE =1 :TMR0割り込みを許可 T0IF =0 :TMR0オーバーフロー割り込み要求フラグをリセット 4.2. 割り込み関数 PIC16F8Aは、EEPROM、タイマー、RB0入力、ポートB変化の4つの割り込みが、一つの 割り込みベクターを使用する為、static void interrupt isr(void){}関数は共通で 使用されます。 2つ以上の割り込みを使用する場合には、割り込み関数の中で発生要因を仕分けて、 それぞれの処理を記述します。 if(T0IF){ タイマー0割り込み処理; } if(INTF){ RB0割り込み処理; } 今回はタイマー0の割り込みだけを許可している為、仕分けを省略しました。 5. 実行結果 LEDの点滅周期は 0の幅 = 0.496msec 1の幅 = 0.504msec 周期 = 1.00msec でした。 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──● │ │ └─┴┘ │ │ │ │ └────┘ ┴ GND 0.1u/50VのコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system