PICでCの練習 2007.04.29〜 LessonC_02。 LEDの高速点滅。
著作者名: 中野 良知 作成開始: 2007.04.29(日) 更新 : 2007.04.29(日) : 2007.05.01(火) 実験回路を巻末へ移動 : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. フローチャート 3. プログラムソースコード 4. キーワード 4.1. RB0 5. アセンブリリスト 6. 出力周期の概算 7. 実行結果 8. 実験回路 1. 目的 while文の中でポートBのビット0に接続したLEDを高速で点滅させます。 2. フローチャート (main) ↓ ポートの初期化 ↓ ├←────────────┐ ↓ │ ポートBのビット0に1を出力 │ ↓ │ ポートBのビット0に0を出力 │ ↓ │ └─────────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル: LesssonC_02 // 作者 : ioio // 目的 : while文でLEDを点滅させます。 // 機能 : ポートBのビット0に接続したLEDを点滅させます。 // マイコン: PIC16F84A // クロック: 20MHz // Config : PROTECT=OFF, WDTE=OFF, XTAL // Compiler: PICC Lite(V9.6)。 HI-TEC software製。 // : >picl -16f84a lesson.c //***************************************************************************** // 変更履歴 // 2007.04.29(日) 作成 // 2007.05.14(月) configでXTALをHS_OSILLATORに変更 //***************************************************************************** #include "pic.h" // デバイス関連の定義を展開します __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR void main(void) { TRISB = 0xFE; // PortB b0=Out. b1,b2,b3,b4,b5,b6,b7=In // 繰り返し実行 while(1){ RB0 = 1; // PortB b0=1 RB0 = 0; // PortB b0=0 } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. RB0 ポートBのビット0を指定します。 例: RB1でポートBのビット1を指定します。 5. アセンブリリスト コンパイルオプションに --ASMLIST を使用して、コンパイラーが生成したアセンブ リリストの一部です。 コンパイル書式例: >picl -16f84a --ASMLIST lessonC_01.c アセンブリリスト抜粋 LINE ADDR- HEX No ESS CODE MNEMONIC CODE ----+------+------+------------------------------------------------------- 17 psect text0 18 03F9 _main 19 ;lesson.c: 18: void main(void) 20 03F9 30FE movlw -2 21 03FA 1683 bsf 3,5 22 03FB 0086 movwf 6 ;volatile 23 03FC l3 24 ;lesson.c: 23: while(1){ 25 ;lesson.c: 24: RB0 = 1; 26 03FC 1283 bcf 3,5 27 03FD 1406 bsf 6,0 28 ;lesson.c: 25: RB0 = 0; 29 03FE 1006 bcf 6,0 30 03FF 2BFC goto l3 31 32 psect config 33 2007 3FF9 dw 16377 ;# 27行目でポートBのビット0をセット。 29行目でポートBのビット0をリセットします。 6. 出力周期の概算 while文のなかで繰返される処理の命令サイクル数を数えます。 26行目 1 バンク切換え 27行目 1 H出力 29行目 1 L出力 30行目 2 goto 1 4 1 4 1 4 1 4 1 4 1 4 1 ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ RB0 ───┘└───┘└───┘└───┘└───┘└───┘└───┘└─ 1命令サイクル=1/20MHz×4=0.2μsec Hの幅=0.2μsec Lの幅=0.2μsec×4=0.8μsec パルス周期=0.2μsec+0.8μsec=1.0μsec パルス周波数=1/1.0(μsec/cycle)=1.0MHz 参考) RB0 = 1; の後にnop命令を3個挿入すると、Hの幅が広がりLと同じ幅になります。 例: while(1){ RB0 = 1; NOP(); // 1命令サイクルを遅延 NOP(); // 1命令サイクルを遅延 NOP(); // 1命令サイクルを遅延 RB0 = 0; } 7. 実行結果 繰り返し周期が1.0μsecで、出力周期の概算と一致します。 RB0 = 1;の後にNOP();を3行追加したときの出力波形です。 8. 実験回路 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