PICでCの練習 2007.05.24(木)〜 LessocC_101。 LEDを0.5秒毎に点滅させます。
著作者名: 中野 良知 作成開始: 2007.05.23(水) 変更 : 2007.05.24(木) 割込み方式に変更
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. CONFIGワード 4.1.1. クロック発振選択 4.1.2. ウォッチドッグタイマ 4.1.3. Band Gap 4.2. クロックの較正 4.3. クロックの調整 4.4. CMCONレジスタ 4.5. ANSELレジスタ 5. 実行結果 6. 実験回路 1. 目的 タイマー割込みで0.5秒毎にLEDを点滅させます。 内蔵クロック発振を工場出荷時の値で較正して使います。 2. ゼネラルフローチャート (main) ↓ クロック較正値設定 ↓ デジタル入出力選択 ↓ ポート入出力設定 ↓ タイマー起動。 ↓ 割込み許可 ↓ ├──┐ ↓ │ └──┘ (4msec毎の割込み) ↓ no <500msec経過?>──┐ ↓yes │ LED出力反転 │ ↓ │ ├───────┘ ↓ (終了) 3. プログラムソースコード //***************************************************************************** // タイトル : LessocC_101 // 作者 : ioio // 目的 : 0.5秒毎にLEDを点滅させます。 // マイコン : PIC12F675 // クロック : 4MHz。内蔵発振。 // Config : MCLR=GP3, WDTE=OFF, INTOSC // Compiler : PICC Lite(V9.6)。 HI-TEC software製。 // Compile : >picl -12f675 lesson.c // ASM List : >picl -12f675 --ASMLIST lesson.c //***************************************************************************** // 変更履歴 // 2007.05.22(火) 作成 // 2007.05.24(木) ソフト遅延での点滅をタイマー割込みでの点滅に変更 // 2007.05.25(金) TRISIO=0x06;をTRISIO =0x08;に修正 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x01D4); // BandGap=0x0, MCLR=GP3, WDTE=OFF, INTOSC //----------------------------------------------------------------------------- // 関数定義 //----------------------------------------------------------------------------- // 定数の定義 #define T4MS 256-125 // 1usec*32*125=4msec #define T500MS 125 // 4msec*125=500msec //----------------------------------------------------------------------------- // グローバル変数定義 unsigned char t0_cnt; // 500msecカウンタ //----------------------------------------------------------------------------- // ビットフィールド構造体定義 //----------------------------------------------------------------------------- // ポートマップ // NAME PIN NO USE // -----+--------+-------------- // GP0 7 LED点滅出力 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { OSCCAL = _READ_OSCCAL_DATA(); // クロック較正値をOSCCALに設定 CMCON = 0x07; // COMPARATOR=Off(Digital I/O) ANSEL = 0x00; // Fosc/2。Analog=Off(Digital I/O) TRISIO = 0x08; // GP0,GP1,GP2,GP4,GP5=出力。GP3=入力 OPTION = 0xD4; // T0CS=Int。PSA=TIMER0。Prescaler=1:32 TMR0 = T4MS; // 1usec*32*125=4msecに設定 INTCON = 0xA0; // GIE=Enable。T0IE=Enable GPIO = 0x00; // 出力を全て0に初期化 t0_cnt = T500MS; // 4msecカウンタを500msecに設定 while(1){ } } //----------------------------------------------------------------------------- // 割込み処理 // 2007.05.24(木) 作成 //----------------------------------------------------------------------------- void interrupt isr(void) { TMR0 = T4MS; // TMR0設定。4msec T0IF = 0; // TMR0割込み発生フラグをリセット if(--t0_cnt == 0){ // 500msec経過したら GPIO0 ^= 1; // GP0出力を反転 t0_cnt = T500MS; // 500msecカウンタ設定 } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. CONFIGワード CONFIGワード 上位6ビット 13 12 11 10 9 8 ┌───┬───┬───┬───┬───┬───┬ │ BG1 │ BG0 │ - │ - │ - │ CPD │ └───┴───┴───┴───┴───┴───┴ 下位8ビット 7 6 5 4 3 2 1 0 ┬───┬───┬───┬───┬───┬───┬───┬───┐ │ CP │BODEN │MCLRE │PWRTE │ WDTE │F0SC2 │F0SC1 │F0SC0 │ ┴───┴───┴───┴───┴───┴───┴───┴───┘ BG1,BG0 :Band Gap。パワーオンリセットや、ブラウンアウトの閾値を設定します。 CPD :データメモリの保護を設定します。 CP :プログラムメモリの保護を設定します。 BODEN :ブラウンアウト検出許可を設定します。 MCLRE :MCLREまたはGP3(入力)の選択を設定します。 PWRTE :パワーアップタイマの許可を設定します。 WDTE :ウォッチドッグタイマーの許可を設定します。 FOSC2,1,0:クロック発振方式の選択を設定します。 4.1.1. クロック発振選択 内蔵4MHzのクロック発振を選択します。 CONFIGワード 下位8ビット 7 6 5 4 3 2 1 0 ┬───┬───┬───┬───┬───┬───┬───┬───┐ │ CP │BODEN │MCLRE │PWRTE │ WDTE │F0SC2 │F0SC1 │F0SC0 │ ┴───┴───┴───┴───┴───┴───┴───┴───┘ ↓ ↓ ↓ 1 0 0 FOSC2=1, FOSC1=0, FOSC0=0 に設定します。 例: __CONFIG(0x01D4); 4.1.2. ウォッチドッグタイマ ウォッチドッグタイマがオーバーフローしたときのリセットベクターへのジャンプ を起こさないように、ウォッチドッグタイマ動作を禁止します。 CONFIGワード 下位8ビット 7 6 5 4 3 2 1 0 ┬───┬───┬───┬───┬───┬───┬───┬───┐ │ CP │BODEN │MCLRE │PWRTE │ WDTE │F0SC2 │F0SC1 │F0SC0 │ ┴───┴───┴───┴───┴───┴───┴───┴───┘ ↓ 0 WDTE=0 に設定します。 4.1.3. Band Gap 工場出荷時に、configワードにBand Gapの値が書きこまれています。 CONFIGワード 上位6ビット 13 12 11 10 9 8 ┌───┬───┬───┬───┬───┬───┬ │ BG1 │ BG0 │ - │ - │ - │ CPD │ └───┴───┴───┴───┴───┴───┴ BG1とBG0がBand Gapの対象ビットです。 パワーオンリセットとブラウンアウト検出の閾値を設定します。 工場出荷時の値を使用することで、カタログの特性値が保証されます。 ROMライターで読み出し、ソースコードに __CONFIG(); で記述します。 例: ROMライターで読み出したconfigの値=0x01FFの場合 0x0 1FF ↑ がBG1,BG0の値。 configの他ビットは必要に応じて変更します。 __CINFIG(0x01D4); と記述します。 configのデータは、コンパイルで生成した.hexリストに反映されます。 例: :02400E00D401DB 区切りをいれて :02 400E 00 D401 DB configデータはD401で0x01D4です。 configデータは、ROMライターで書き込みます。 4.2. クロックの較正 工場出荷時に、プログラムメモリのアドレス0x3FFにRETLW命令コードとクロック較正 値が書き込まれています。 例: アドレス データ ニーモニック ---------+---------+----------------- 0x3FF 0x3468 RETLW 0x68 0x68がクロック較正値です。 注意)このデータはバルク消去コマンドで消去されます。 PICC-Liteのソースコードで OSCCAL = _READ_OCSCAL_DATA(); と記述した部分の、コンパイラーが生成したアセンブリリストです。 22 03D8 1283 bcf 3,5 23 03D9 23FF call 1023 24 03DA 1683 bsf 3,5 25 03DB 0090 movwf 16 call 1023 を実行すると、Wレジスターに較正値を設定してリターンします。 このWレジスターの値をOSCCALレジスター(バンク1の16番地)に代入しています。 ROMライターが書き込み時に、プログラムメモリの0x3FF番地を消去又は変更していな い場合は、 OSCCAL = _READ_OCSCAL_DATA(); が使えます。 ROMライターが書き込み時に、プログラムメモリの0x3FF番地を消去又は変更する場合 には、書き込み前にプログラムメモリの0x3FF番地の較正値を読み出しておいて、 ソースコードに、 OSCCAL = クロック較正値; 例: OSCCAL = 0x68; と記述します。 工場出荷時の較正値を使用すると、クロック発振周波数の精度は+/-2%以内になりま す。 発振周波数の精度は電源電圧、周囲温度等で変動します。 4.3. クロックの調整 工場出荷時の較正値が分からない場合は、CONFIGのF0SC2,F0SC1,F0SC0をINTOSCの CLKOUT(101)に設定して、命令サイクルクロックをGP4に出力します。 CONFIGワード 下位8ビット 7 6 5 4 3 2 1 0 ┬───┬───┬───┬───┬───┬───┬───┬───┐ │ CP │BODEN │MCLRE │PWRTE │ WDTE │F0SC2 │F0SC1 │F0SC0 │ ┴───┴───┴───┴───┴───┴───┴───┴───┘ ↓ ↓ ↓ 1 0 1 GP4にオシロスコープ又は周波数カウンタを接続し、パルス幅が1usec又は周波数が 500KHzになるように、OSCCALレジスタの設定値を調整します。 オシロスコープ又は周波数カウンタが無い場合は、0.5秒毎のLED点滅プログラムを実 行し、11回点灯する時間を測りながらOSCCALレジスタの設定値を調整する方法を利用 することが出来ます。 1 2 3 4 5 6 7 8 9 10 11 ┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ ─┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└ │←─────────────────→│ 10秒になるようOSCCALを調整 4.4. CMCONレジスタ CMCONレジスタのCM2,CM1,CM0を全て1に設定し、ポートをDigital I/Oにします。 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ - │ COUT │ - │ CINV │ CIS │ CM2 │ CM1 │ CM0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ ↓ ↓ ↓ 1 1 1 例: CMCON = 0x07; // COMPARATOR=Off(Digital I/O) ポートをDigital I/Oに設定しない場合、ポートの入出力が正常に実行されないことが あります。 4.5. ANSELレジスタ ANSELレジスタのANS2,ANS1,ANS0を全て0に設定し、ポートをDigital I/Oにします。 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ - │ADCS2 │ADCS1 │ADCS0 │ ANS3 │ ANS2 │ ANS1 │ ANS0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ ↓ ↓ ↓ 0 0 0 例: ANSEL = 0x00; // Fosc/2。Analog=Off(Digital I/O) ポートをDigital I/Oに設定しない場合、ポートの入出力が正常に実行されないことが あります。 5. 実行結果 GP0の出力です。 6. 実験回路 PIC12F675 ┌────┐1 │ VDD├──●──────────●─────────← +5V │ │ │0.1u │ │ │ ┴ /50V │┴│100u/16V │ │8 ┬ └┬┘ │ VSS├──●──────────●────────── GND │ │ │ │ │ LED │ │ │7 ┌─┬┐K │ │ GP0├──R330─┤ │├────┘ │ │ └─┴┘ └────┘ 電源パスコン0.1u/50VのセラミックコンデンサーはVDDとVSSの近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system