PICでCの練習 2007.05.27(日)〜 LessocC_103。 CLOCK、CW/CCW信号を受信してステッピングモータを回します。
著作者名: 中野 良知 作成開始: 2007.05.26(土) 更新 : 2007.05.27(日) : 2007.05.29(火) 回路図GP3にプルアップ抵抗を追加。
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. ポートエッジ割込み 4.1.1. OPTIONレジスタ 4.1.2. INTCONレジスタ 4.2. WPUレジスタ 4.3. const 5. 実行結果 6. 実験回路 1. 目的 CLOCKとCW/CCWを受信してステッピングモータを回します。 CLOCKの立上りエッジで割込み検出を行います。 2. ゼネラルフローチャート (main) ↓ クロック較正値設定 ↓ デジタル入出力選択 ↓ ポート入出力設定 ↓ GP2を立上りエッジ検出に設定 ↓ ポートエッジ割込みを許可 ↓ ├←──┐ ↓ │ └───┘ (GP2立上りエッジ割込み) ↓ no(CCW) <CW?> ─────────┐ ↓yes ↓ 配列添え字+1 配列添え字−1 ↓ ↓ ├───────────┘ ↓ 配列データを出力(1-2相パルス) ↓ 割込み発生フラグリセット ↓ (終了) 3. プログラムソースコード //***************************************************************************** // タイトル : LessocC_103 // 作者 : ioio // 目的 : CLOCKとCW/CCW信号を受けてステッピングモータを回します。 // 内容 : CLOCKは立上りエッジを検出。 1-2相方式の駆動パルスを発生。 // マイコン : 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.26(土) 作成 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x01D4); // BandGap=0x0, MCLR=GP3, WDTE=OFF, INTOSC //----------------------------------------------------------------------------- // 関数定義 //----------------------------------------------------------------------------- // 定数定義 const unsigned char step_data[8] = {0x01,0x11,0x10,0x12,0x02,0x22,0x20,0x21}; // ステップパルスデータ。1-2相方式。 //----------------------------------------------------------------------------- // グローバル変数定義 int step_no; // ステップパルスNo //----------------------------------------------------------------------------- // ビットフィールド構造体定義 //----------------------------------------------------------------------------- // ポートマップ // NAME PIN NO I/O USE // -----+--------+-----+------------------------------------------------------- // GP0 7 O A // GP1 6 O -A // GP2 5 I CLOCK入力(内蔵Pull Up)。立上りエッジで割込み。 // GP3 4 I CW/CCW入力(外部Pull Up) // GP4 3 O B // GP5 2 O -B //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { OSCCAL = _READ_OSCCAL_DATA(); // クロック較正値をOSCCALに設定 CMCON = 0x07; // COMPARATOR=Off(Digital I/O) ANSEL = 0x00; // AN3,2,1,0=Off(Digital I/O) TRISIO = 0x0C; // GP3,GP2=入力。GP5,GP4,GP1,GP0=出力 OPTION = 0x7F; // Pull Up=On。INTEDG=Rising INTCON = 0x90; // GIE=Enable。INTE=Enable WPU = 0x04; // GP2=Pull Up GPIO = step_data[0]; // ステップパルス出力を初期化 step_no = 0; // ステップパルスデータNo初期化 while(1); } //----------------------------------------------------------------------------- // 割込み処理 // 2007.05.26(土) 作成 //----------------------------------------------------------------------------- void interrupt isr(void) { if(GPIO3){ // CWなら if(++step_no == 8){ // ステップパルスデータNo+1 step_no = 0; } }else{ // CCWなら if(--step_no == -1){ // ステップパルスデータNo-1 step_no = 7; } } GPIO = step_data[step_no]; // ステップパルス出力 INTF = 0; // GP2ポート割込みフラグリセット } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. ポートエッジ割込み 4.1.1. OPTIONレジスタ 7 6 5 4 3 2 1 0 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ GPPU │INTEDG│ T0CS │ T0SE │ PSA │ PS2 │ PS1 │ PS0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ 0 1 1 1 1 1 1 1 GPPU :WPUレジスタと合わせてGP2のプルアップを許可します。 INTEDG :GP2の入力信号の立上がりエッジで割込みが発生します。 例: OPTION = 0x7F; // Pull Up=On。INTEDG=Rising 4.1.2. INTCONレジスタ 7 6 5 4 3 2 1 0 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ GIE │ PEIE │ T0IE │ INTE │ GPIE │ T0IF │ INTF │ GPIF │ └───┴───┴───┴───┴───┴───┴───┴───┘ 1 0 0 1 0 0 0 0 GIE :全割込みを許可します。 INTE :GP2の割込みを許可します。 INTF :GP2の割込み発生フラグをリセットします。 例: INTCON = 0x90; // GIE=Enable。INTE=Enable 4.2. WPUレジスタ 7 6 5 4 3 2 1 0 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ - │ - │ WPU5 │ WPU4 │ - │ WPU2 │ WPU1 │ WPU0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ 0 0 0 0 0 1 0 0 WPU2 :GP2のプルアップを許可します。 例: WPU = 0x04; // GP2=Pull Up GP3端子には内部プルアップ機能がありません。外部抵抗でプリアップします。 4.3. const const unsigned char step_data[8] = {0x01,0x11,0x10,0x12,0x02,0x22,0x20,0x21}; // ステップパルスデータ。1-2相方式。 constにより、ROM領域に配列要素のデータを配置します。 65 psect const1 66 0050 0782 addwf 2 67 0051 _step_data 68 0051 3401 retlw 1 69 0052 3411 retlw 17 70 0053 3410 retlw 16 71 0054 3412 retlw 18 72 0055 3402 retlw 2 73 0056 3422 retlw 34 74 0057 3420 retlw 32 75 0058 3421 retlw 33 Wレジスターに配列添え字の値をセットして0x0050番地をコールします。 addwfの実行開始の時は、次の命令の先読み込みの為にPCは0x0051になっています。 addwfが実行されると、PC+WがPCにセットされてテーブルジャンプをします。 ジャンプ先でWレジスターに配列要素の値が設定されてリターンします。 unsigned char step_data[8] = {0x01,.... とすると、配列要素はRAM領域に配置されます。 RAM領域が消費される他に、配列要素 の初期化の為にプログラムステップ数も増えます。 5. 実行結果 上:GP0(A相)の出力信号 下:CLOCK入力信号 左がLessonC_102の回路、右がLessonC_103の回路です。 6. 実験回路 PIC12F675 ┌────┐1 │ VDD├──●────●─────●─────────← +5V │ │ │0.1u │ │ │ │ ┴ /50V │ │┴│100u/16V │ │8 ┬ │ └┬┘ │ VSS├──●────│─────●────────── GND │ │ │ │ │ │5 │ │ │ GP2├───────│─────│───────← CLOCK │ │ R10K │ │ │4 │ │ │ GP3├───────●─────│───────← CW/CCW │ │ │ │ │ │ ステッピング │ │ │ モータ │ │ │ ┌────┐ │ │ 2SK2782 │ │ │ │ │ D┌──────│────┤A相 │ │ │7 G┌┴┐S │ │ │ │ GP0├─────┤ ├─────● │ │ │ │ └─┘ │ │A_COMMON├──┐ │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌──────│────┤-A相 │ │ │ │6 G┌┴┐S │ │ │ │ │ GP1├─────┤ ├─────● │ │ │+5V/6A │ │ └─┘ │ │ │ ├── │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌──────│────┤B相 │ │ │ │3 G┌┴┐S │ │ │ │ │ GP4├─────┤ ├─────● │ │ │ │ │ └─┘ │ │B_COMMON├──┘ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ D┌──────│────┤-B相 │ │ │2 G┌┴┐S │ │ │ │ GP5├─────┤ ├─────● └────┘ │ │ └─┘ │ │ │ │ └────┘ ┴ GND 電源パスコン0.1u/50VのセラミックコンデンサーはVDDとVSSの近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system