PICでCの練習 2007.05.01(火)〜 LessonC_05。 500msec遅延関数を作成。
著作者名: 中野 良知 作成開始: 2007.05.01(火) 更新 : 2007.05.01(火) : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. フローチャート 3. プログラムソースコード 4. キーワード 4.1. 関数宣言 4.2. 関数 4.3. ローカル変数とグローバル変数 5. 実行結果 6. 実験回路 1. 目的 500msecの遅延関数を作り、LEDを0.5sec毎に点滅させます。 2. フローチャート (main) ↓ ポートの初期化 ↓ ├←────────────┐ ↓ │ ポートBのビット0に1を出力 │ ↓ │ 0.5sec遅延関数呼出 │ ↓ │ ポートBのビット0に0を出力 │ ↓ │ 0.5sec遅延関数呼出 │ ↓ │ └─────────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル: LesssonC_05 // 作者 : ioio // 目的 : ソフト遅延を関数にします。 // マイコン: PIC16F84A // クロック: 20MHz // Config : PROTECT=OFF, WDTE=OFF, XTAL // Compiler: PICC Lite(V9.6)。 HI-TEC software製。 // : >picl -16f84a lesson.c //***************************************************************************** // 変更履歴 // 2007.05.01(火) 作成 // 2007.05.14(月) configでXTALをHS_OSILLATORに変更 //***************************************************************************** #include "pic.h" // デバイス関連の定義を展開 #define T1MS 500 #define T500MS 500 __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR void delay500msec(void); // 関数を宣言 void main(void) { TRISB = 0xFE; // PortB b0=Out. b1,b2,b3,b4,b5,b6,b7=In // 繰り返し実行 while(1){ // 繰り返し // LED ON RB0 = 1; // Port b0=1 // ソフト遅延 delay500msec(); // LED OFF RB0 = 0; // Port b0=0 // ソフト遅延 delay500msec(); } } //----------------------------------------------------------------------------- // 機能 : 500msec遅延関数 // 引数 : なし // 戻値 : なし // 作成 : 2007.05.01(火) //----------------------------------------------------------------------------- void delay500msec(void) { unsigned int cnt1; unsigned int cnt2; cnt1 = T500MS; // 500msecの遅延 while(cnt1--){ cnt2 = T1MS; // 1msecの遅延 while(cnt2--); } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. 関数宣言 main()の前にmain()で使用する関数を宣言します。 void delay500msec(void); // 関数を宣言 は 戻り値と引数が無い関数 delay500msec() を宣言しています。 4.2. 関数 書式: 戻り値の型 関数名(引数の型と引数){..} 例: void delay500msec(void) { ... } 先頭のvoidは戻り値がない事を表します。 1個の戻り値を指定する事ができます。 例: char f(void){} 符号付1バイトの戻り値が指定されます。 関数名は delay500msec です。 (void)のなかのvoidは引数がない事を表します。 複数の引数を設定することができます。 int f(int a, int b, unsigned int c); {..}の中に処理を記述します。 例: { unsigned int cnt1; unsigned int cnt2; cnt1 = T500MS; // 500msecの遅延 while(cnt1--){ cnt2 = T1MS; // 1msecの遅延 while(cnt2--); } } 4.3. ローカル変数とグローバル変数 関数の中で宣言した変数cnt1とcnt2は、その関数の中でだけ使えるローカル変数 です。 main()とmain()以外の関数で共通に使えるグローバル変数は、main()の前で宣言しま す。 例: #include "pic.h" // #define T1MS 500 #define T500MS 500 __CONFIG(0x3FF9); // config wordを設定 void delay500msec(void); // 関数の宣言 unsigned int cnt1; // グローバル変数の宣言 void main(void) { .... } この場合、 関数の中のcnt1の宣言は不要です。 void delay500msec(void) { unsigned int cnt2; // cnt2はローカル変数 .... } 関数の中でパブリック変数と同じ名前のローカル変数を宣言すると、その関数の 中ではローカル変数が優先します。 汎用のレジスターを多く有するマイコン用のコンパイラーは、ローカル変数を汎用 のレジスターに割付る場合があり、高速での実行が期待できます。 PICC Liteコンパイラーは、RAMをローカル変数に一時的に割り当てるためグローバル 変数を使用したときと実行速度は同じです。 5. 実行結果 cnt1がローカル変数 cnt1がグローバル変数 -------------+--------------------+------------------------ Hの幅 0.504sec 0.504sec Lの幅 0.496sec 0.496sec 出力の周期 1sec 1sec 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