PICでCの練習 2007.05.07(月)〜 LessonC_13。 遅延関数でタイマー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. プリスケーラー 4.3. タイマー0 4.4. T0IF 5. 実行結果 6. 実験回路 1. 目的 タイマー0を利用して遅延関数を作り、0.5秒毎にLEDを点滅させます。 2. ゼネラルフローチャート (main) ↓ ポートの初期化 ↓ タイマープリスケーラー設定(1:32) ↓ ├←─────────┐ RB0出力のビット反転 │ ↓ │ 0.5秒遅延 │ ↓ │ └──────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_13 // 作者 : 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 //----------------------------------------------------------------------------- // 関数定義 void delay_msec(unsigned int); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { TRISB = 0x00; // PortB b0,b1,b2,b3,b4,b5,b6,b7=Out OPTION = 0b11000100; // プリスケール=1:32(下位3ビット) PORTB = 0x00; // ポートB初期化。LED全消灯。 while(1){ RB0 ^= 1; // 出力ビット反転。排他的論理和。 delay_msec(500); } } //----------------------------------------------------------------------------- // タイトル : msec単位の遅延関数 // 作成 :2007.05.07(月) //----------------------------------------------------------------------------- #define SET_TMR0 256-156 // 156*32*200ns=998.4us void delay_msec(unsigned int msec) { while(msec--){ TMR0 = SET_TMR0; // タイマー0設定 T0IF = 0; // タイマー0オーバーフローフラグリセット while(T0IF == 0); // タイマー0オーバーフロー待ち } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. OPTION プリスケーラーのクロックソース、割り当て、分周比を設定するレジスターです。 │ │ │ ┌┘ │ ┌┴──┬───┐ ↓ ↓ ↓ ↓ ↓ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ RBPU │INTEDG│ T0CS │ T0SE │ PSA │ PS2 │ PS1 │ PS0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ 1 1 0 0 0 1 0 0 T0CS =0 :内部命令サイクルクロックを選択 PSA =0 :プリスケーラーに割り当て PS2-0=100:1:32に設定 4.2. プリスケーラー タイマー0で1msecをカウントできるようにカウントパルスの周期を設定します。 プリスケーラーは命令サイクルクロックを分周し、タイマー0にカウントパルスを供 給します。 ┌────┐ ┌──┐ ┌────────┐ ┌─────┐ │1/20MHz ├→┤4倍 ├→┤ プリスケーラー ├→┤タイマー0 │ └────┘ └──┘↑└────────┘↑└─────┘ 命令サイクルクロック┘ 分周 └カウントパルス タイマー0カウントパルス=1/20MHz×4×分周比(32)=200ns×32=6.4us 4.3. タイマー0 1バイトのタイマーカウンターレジスターです。 プリスケーラーからのカウントパルス毎にインクリメントされます。 タイマー0カウント値=1msec÷カウントパルス=1msec÷6.4us=156.25→156 (156-156.25)÷156.25=-0.16% が誤差になります。 タイマー0設定値=256-タイマー0カウント値=256-156=100 を実行時に設定します。 注意: タイマー0がオーバーフローした後に再びタイマー0を設定する場合は、プリスケーラ ーからのカウントパルスが来る前に設定します。 カウントパルス周期が6.4usの場合は 6.4us÷命令サイクル=6.4us÷1/20Mhz×4=32命令以内です。(1サイクル命令で) 4.4. T0IF タイマー0がオーバーフローをするとセットされるフラグです。 1msecのカウント終了をこのフラグでチェックします。 ┌───────┐ ┌───┐ ─┤ TMR0 ├→────┤ T0IF │ └───────┘ overflow └───┘ タイマー0 T0IF 備考 ----------+-------+--------------------------- 100 0 タイマー0初期値 101 0 ... 0 254 0 255 0 0 1 オーバーフローでセット タイマー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──● │ │ └─┴┘ │ │ │ │ │ │5 │ │ Vss├─────────────● │ │ │ └────┘ ┴ GND 0.1u/50VのコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system