PICでCの練習 2007.05.13(日)〜 LessonC_19。ポインターを使ってステッピングモータを正転/逆転させます。
著作者名: 中野 良知 作成開始: 2007.05.13(日) 修正 : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. ポインター 4.2. ポインターの初期化 4.3. ポインターのインクリメント・デクリメント 4.4. 配列要素の取り出し 4.5. 配列要素への代入 5. 実行結果 6. 実験回路 1. 目的 スイッチのオフ/オンで配列添え字変数を増/減して、ステッピングモータを正転/逆転 させます。 2. ゼネラルフローチャート (main) ↓ ポートの初期化 ↓ ├←────────────────┐ ↓ │ 配列データ出力(駆動パルス) │ ↓ yes │ <スイッチオン?>────┐ │ ↓no │ │ ポインターを ポインターを │ インクリメント デクリメント │ ↓ ↓ │ ├──────────┘ │ 20msecソフト遅延 │ ↓ │ └─────────────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_19 // 作者 : ioio // 目的 : ポインターを使ってステッピングモータを正転/逆転させます。 // マイコン : 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.13(日) 作成 // 2007.05.14(月) configのXTALをHSに変更。 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR //----------------------------------------------------------------------------- // 関数定義 void delay_msec(unsigned int); //----------------------------------------------------------------------------- // 定数の定義 #define T1MS 500 // 1msecソフト遅延カウント //----------------------------------------------------------------------------- // グローバル変数定義 //----------------------------------------------------------------------------- // ビットフィールド構造体定義 //----------------------------------------------------------------------------- // ポートマップ // NAME PIN NO USE // -----+--------+------------- // RA0 17 回転切換え // RB0 6 A // RB1 7 -A // RB2 8 B // RB3 9 -B //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { unsigned char step_data[8] = { 1, 1 + 4, 4, 4 + 2, 2, 2 + 8, 8, 8 + 1 }; // ステップパルスデータを配列に定義 unsigned char* step_ptr; // 配列要素指定ポインターを宣言 step_ptr = step_data; // ポインター初期化 TRISA = 0x0F; // PortA b0,b1,b2,b3=In TRISB = 0x00; // PortB b0,b1,b2,b3,b4,b5,b6,b7=Out PORTB = 0x00; // ポートB初期化。 while(1){ PORTB = *step_ptr; // ステップパルス出力 if(RA0){ // スイッチオフなら(正転) if(++step_ptr == (step_data + 8)){ step_ptr = step_data; // 配列の[0]を指定 } }else{ // スイッチオンなら(逆転) if(--step_ptr == (step_data - 1)){ step_ptr = step_data + 7; // 配列の[7]を指定 } } delay_msec(20); // 20msecソフト遅延 } } //----------------------------------------------------------------------------- // 機能 : 引数で遅延時間を設定 // 引数 : unsigned int。 遅延時間をmsecで設定。 // 戻値 : なし // 作成 : 2007.05.02(水) //----------------------------------------------------------------------------- void delay_msec(unsigned int cnt1) { unsigned int cnt2; while(cnt1--){ cnt2 = T1MS; while(cnt2--); // 約1msecの遅延 } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. ポインター unsigned char* step_ptr; 又はunsigned char *step_ptr; で宣言します。 *の位置が違いますが機能は同じです。 符号無し1バイトのデータ型でポインター名 step_ptr が宣言されます。 4.2. ポインターの初期化 step_ptr = step_data; step_ptr = &step_data[0]; どちらもstep_data[0]の要素位置が設定されます。 &はstep_data[0]のRAMアドレスを取得します。 step_data配列はコンパイラーによってRAM領域に割り付けられます。 step_dataの領域 │───────────────────────│ ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↑ step_ptr = step_data;によって step_ptrはこの位置を示します。 4.3. ポインターのインクリメント・デクリメント step_ptr++; ++step_ptr; step_ptr--; --step_ptr; などの記述ができます。 変数名の前後の++又は--演算子の働きはLessonC_11のキー ワードを参照して下さい。 step_dataの領域 │───────────────────────│ ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↑ ここでstep_ptr++;を実行すると ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↑ step_ptrはここを示します。 step_dataの領域 │───────────────────────│ ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↑ ここでstep_ptr--;を実行すると ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↑ step_ptrはここを示します。 他の変数領域を示すこともあるため、ポインターの取り扱いは要注意です。 インクリメント又はデクリメントでポインターが領域外に出たら、忘れずに領域内に 戻します。 4.4. 配列要素の取り出し PORTB = *step_ptr; ポインターの前に*を記述する事で、ポインターが示している配列要素が取り出され てポートBへ出力されます。 step_dataの領域 │───────────────────────│ ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↓step_ptrがここを示していると 値6を取り出し ↓ PORTBへ出力します。 4.5. 配列要素への代入 *step_ptr = 5; ポインターの前に*を記述する事で、ポインターが示している配列要素へ値が代入さ れます。 step_dataの領域 │───────────────────────│ ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── ↑step_ptrがここを示していると 値5を代入します。 ↓結果 ──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬── │ │ │ 1 │ 5 │ 4 │ 5 │ 2 │ A │ 8 │ 9 │ │ ──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴── 5. 実行結果 上から、A相、B相、-A相、-B相 のポート出力波形です。 6. 実験回路 PIC16F84A ┌────┐14 │ VDD├──────●──────●────●──── +5V │ │ │ │0.1u │ │ │ R10K ┴ /50V │┴│100u/16V │ │4 │ 0.1u/50V ┬ └┬┘ │ -MCLR├──────●─┤├───●────┘ │ │ │ │ │16 ┌ ─ ─ ─ ┐ │ │ OSC1├───●─┤├──┐ │ │ │ │┴ ││ │ │ │ □ 20MHz │ │ │ │15 │┬ ││ │ │ OSC2├───●─┤├──● │ │ │ └ ─ ─ ─│┘ │ │ │5 ┌───────┘ │ │ Vss├─●───────────● │ │ │ │ │ +5V │ │ │ │ │ │ │ R10K 正転/逆転 │ │ │17 │ ─┴─ │ ステッピング │ RA0├──●──○ ○─────● モータ │ │ │ ┌────┐ │ │ 2SK2782 │ │ │ │ │ D┌──────│────┤A相 │ │ │6 G┌┴┐S │ │ │ │ RB0├─────┤ ├─────● │ │ │ │ └─┘ │ │A_COMMON├──┐ │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌──────│────┤-A相 │ │ │ │7 G┌┴┐S │ │ │ │ │ RB1├─────┤ ├─────● │ │ │+5V/6A │ │ └─┘ │ │ │ ├── │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌──────│────┤B相 │ │ │ │8 G┌┴┐S │ │ │ │ │ RB2├─────┤ ├─────● │ │ │ │ │ └─┘ │ │B_COMMON├──┘ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ D┌──────│────┤-B相 │ │ │9 G┌┴┐S │ │ │ │ RB3├─────┤ ├─────● └────┘ │ │ └─┘ │ │ │ │ └────┘ ┴ GND 0.1u/50VのセラミックコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system